基于java的TCP通信

TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP通信分为客户端和服务器端,对应的对象分别是Socket和Server Socket。


ServerSocket类

创建一个ServerSocket类,同时在运行该语句的计算机的指定端口建立一个监听服务,如:

ServerSocket MyServerSocket = new ServerSocket(port);

这里制定提供服务的端口是500,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区分,不同端口号上提供不同的服务。为了监听可能的Client请求,执行如下的语句:

Socket LinkSocket = MyServerSocket.accept();

调用的accept方法使服务器端的程序处于等待状态,程序将一直拥塞直到捕获一个来自客户端的请求,并返回一个用于该Client通信的Socket对象 LinkSocket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远程终端Client读写数据。结束监听时,关闭ServerSocket对象:

MyServerSocket.close();

创建服务端流程:

  1. 建立TCP服务端的Socket服务,通过ServerSocket对象;

  2. 服务端必须提供一个端口,否则客户端无法连接;

  3. 获取连接过来的客户端对象;

  4. 通过客户端对象获取Socket流,读取客户端发来的数据;

  5. 关闭资源,关闭客户端,关闭服务端;

 


Socket 类

当Client程序需要从Server端获取信息及其他服务时,营创建一个Socket对象:

Socket MySocket = new Socket(host,port);

Socket类构造函数的第一个参数是Server计算机的主机地址,第二个参数是Server上提供服务的端口号。Socket对象建立成功之后,就可以在Client和Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的getOutStream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新的返还到Server端。当Server和Client端通信结束后,可以调用Socket类的close()方法关闭Socket,拆除连接。ServerSocket一般仅用于设置端口号和监听,真正进行通信的是服务器端的Socket与客户端的Socket,在ServerSocket进行accept之后,就将主动权转让了。

创建客户端流程:

  1. 建立TCP客户端的Socket服务,使用的是Socket对象,明确地址连接主机;

  2. 建立成功后,该传输通道就是Socket流。通过getOutputStream()和getInputStream()来获取输入输出流;

  3. 使用输出流将数据写出;

  4. 关闭Socket服务;


TCP服务器和客户端建立流程如下图所示:


下面我们在用一个示例来实现上TCP的服务,该案例用java在eclipse平台上编写,对于Java基础知识不在拓展,感兴趣的读者可以自行学习。该案例实现如下功能:

  1. 客户端发送信息给服务器,并在服务器的Console窗口输出;

  2. 服务器回复信息给客户端,并在客户端的Console窗口输出;


服务器端的源代码


客户端端的源代码


输出结果

 

2018/7/25


致谢:

感谢 两广总督 给予的技术支持!