TCP通信

Socket(套接字):用于描述IP地址和端口,是通信链的句柄,是一种基于TCP/IP协议的长连接。

原理:应用程序通过Socket向网络发出请求或者应答网络请求。在网络连接成功后,应用程序两端都会产生一个Socket实例,完成所需会话。Socket在创建的时候就尝试连接网络,若连接错误则抛出异常。


C-S模式(客户端/服务端)

服务端:创建监听服务——>等待连接——>进行通信——>关闭连接

客户端:连接服务器——>进行通信——>关闭连接


具体实现:

服务端(Server)

(1)创建ServerSocket对象,并设置连接的端口号

ServerSocket  socket  = new  ServerSocket(8088);//8088为端口号

(2)监听socket的连接

Socket  accept():用于等待客户连接,是一个阻塞方法,若连接成功返回一个套接字对象

                          当一个客户端连接成功时,解除阻塞  ,否则该方法一直阻塞。

(3)通过Socket的输入流方法来获取客户端的输入流

InputStream  getInputStream():获取客户端的输入流。

这里我们应该跑正获取的输入流与客户端的输出流字符集相同,否则看不懂

(4)读取客户端发来的信息

注意:在读取客户端发来的信息时,windows和linux存在一定的差异

linux:当客户端与服务器断开连接后我们通过输入流会读取到null,但这是合乎逻辑的,因为缓冲流的readLine()方法会返回一个null来表示无法继续从该流中读取到数据,参照之前服务文本文件的判断。

windows:当服务器与客户端断开连接后,readLine()会抛出异常。

(5)创建Server对象,并启动服务器


客户端(Client)

(1)创建Socket对象连接网络

Socket(String  address,int  port):利用IP地址和端口号创建连接对象

(2)使用Socket的输出流方法来获取输出流

OutputStream  getOutputStream():获取客户端将发送的输出流

(3)创建Client对象,并启动客户端

这里注意:当客户端需要向服务端发送消息时,应先启动服务端,否则网络连接不上将抛出异常


常用的TCP通信方法:

int  getLocalPort():获取本地端口号

int  getPort():获取远端计算机的端口号

InetAddress  getHostAddress():获取套接字绑定的本地地址

InetAddress  getInetAddress():获取套接字绑定的远端地址

String  getHostAddress():将套接字地址转换为文本形式的IP地址

String  getCanonicalHostName():获取套接字地址的完全限定域名

void  close():关闭网路连接,同时也关闭了流。但在关闭Socket对象时应处理异常。

你可能感兴趣的:(TCP通信,Socket套接字,客户端Client,服务端Server)