[关闭]
@cxm-2016 2016-09-18T08:27:16.000000Z 字数 1690 阅读 2012

Java:基于TCP的网络通信

java kotlin no
陈小默(水平有限,恳请批评指正)


TCP协议是一种面向连接的网络通信协议。TCP协议会在两台需要连接的设备之间创建一条虚拟链路,并将信息报按照适当的次序放好传送,在接收端收到消息后再正确的还原。TCP协议使用重发机制:当一个通信实体发送一个消息个另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的回信,则会再次发送刚才收到的信息。

服务器

Java中能够接收到其他通信实体连接请求的类是ServerSocket,其对象用来监听来自客户端的Socket连接,如果没有连接它将一直处于等待状态。
构造方法介绍:

  1. public ServerSocket(int port);

创建一个服务端,并监听port端口

  1. public ServerSocket(int port, int backlog);

创建一个服务端,并设置连接队列的长度,超出限制的连接将直接失败

  1. public ServerSocket(int port, int backlog, InetAddress bindAddr)

如果机器存在多个IP地址可以通过设置InetAddress来讲服务端绑定到指定IP上。
当创建完成服务端后,我们还需要使用accept()方法去监听连接(该方法是线程阻塞的)

  1. fun initService(){
  2. val service = ServerSocket(10000)//推荐1024以上的端口,避免与系统应用冲突
  3. var client = service.accept()
  4. }

使用Socket通信

Socket在通信中的角色是客户端,用于和一直IP和端口的服务端连接。
常用构造方法如下:

  1. public Socket(String host, int port);

该构造方法指定了服务端的主机地址和端口号,如果连接失败则抛出异常
下面来看一个简单的示例:
这是服务端

  1. fun initService() {
  2. val server = ServerSocket(10000)
  3. val client = server.accept()
  4. val br = BufferedReader(InputStreamReader(client.inputStream))
  5. println(br.readLine())
  6. br.close()
  7. server.close()
  8. }

这是客户端

  1. fun initClient() {
  2. val client = Socket("127.0.0.1", 10000)
  3. client.outputStream.write("Hello! I'm client...\r\n".toByteArray())
  4. client.outputStream.flush()
  5. client.close()
  6. }

在两个程序中分别运行这两个方法就能看见其中的通信过程了

多线程通信

通过上面的例子我们感觉到,这样每次仅能与一个客户端通信是不合适的,为了方便服务端与多个客户端的通信,我们引入了线程操作。我们需要在服务端增加线程操作,每当与一个客户端连接就开启一个线程

  1. fun initService() {
  2. val server = ServerSocket(10000)
  3. while (true) {
  4. val client = server.accept()
  5. Thread(Runnable {
  6. val reader = BufferedReader(InputStreamReader(client.inputStream))
  7. println(reader.readLine())
  8. reader.close()
  9. client.close()
  10. }).start()
  11. }
  12. }

客户端不变

  1. fun initClient() {
  2. val client = Socket("127.0.0.1", 10000)
  3. client.outputStream.write("Hello! I'm client...\r\n".toByteArray())
  4. client.outputStream.flush()
  5. client.close()
  6. }

当我们启动服务端后可以多次启动客户端。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注