最开始学习过Socket编程,半年没看有所遗忘,在这里简单总结一下。
一. 总览
TCP
TCP 协议提供面向连接的服务,通过它建立的是可靠地连接。
Java 为 TCP 协议提供了两个类:Socke 类和 ServerSocket 类。一个 Socket 实例代表了 TCP 连接的一个客户端,而一个 ServerSocket 实例代表了 TCP 连接的一个服务器端。
TCP Socket
一般在 TCP Socket 编程中,客户端有多个,而服务器端只有一个,客户端 TCP 向服务器端 TCP 发送连接请求,服务器端的 ServerSocket 实例则监听来自客户端的 TCP 连接请求,并为每个请求创建新的 Socket 实例,由于服务端在调用accept()
等待客户端的连接请求时会阻塞,直到收到客户端发送的连接请求才会继续往下执行代码,因此要为每个 Socket 连接开启一个线程。
服务器端要同时处理 ServerSocket 实例和 Socket 实例,而客户端只需要使用 Socket 实例。另外,每个 Socket 实例会关联一个 InputStream 和 OutputStream 对象,我们通过将字节写入套接字的 OutputStream 来发送数据,并通过从 InputStream 来接收数据。
二. TCP Socket步骤
客户端
客户端向服务器端发送连接请求后,就被动地等待服务器的响应。
- 创建一个 Socket 实例
Socket client = new Socket("127.0.0.1", 20006);
构造函数向指定的远程主机和端口建立一个 TCP 连接 - 通过套接字的 I/O 流与服务端通信
1 | BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); |
- 关闭连接
client.close();
服务端
服务端的工作是建立一个通信终端,并被动地等待客户端的连接。
- 创建一个 ServerSocket 实例并指定本地端口,用来监听客户端在该端口发送的 TCP 连接请求
ServerSocket server = new ServerSocket(20006);
- 重复执行:
2.1 调用 ServerSocket 的 accept()方法以获取客户端连接,并通过其返回值创建一个 Socket 实例client = server.accept();
2.2 为返回的 Socket 实例开启新的线程,并使用返回的 Socket 实例的 I/O 流与客户端通信new Thread(new ServerThread(client)).start();
- 通信完成后,使用 Socket 类的 close()方法关闭该客户端的套接字连接
server.close();
三. 例子
Client1
1 | import java.io.BufferedReader; |
Server1
1 | import java.net.ServerSocket; |
ServerThread(该类为多线程类,用于服务端)
1 | import java.io.BufferedReader; |