TCP 和 UDP 的区别
在传输层,TCP 协议是有连接的,可靠传输,面向字节流,全双工。 而 UDP 协议是无连接的,不可靠传输,面向数据报,全双工。
有连接和无连接的区别是在进行网络通信的时候,通信双方有没有保存对端的地址信息。即假设 A 和 B 进行通信,A 保存了 B 的地址信息,B 也保存了 A 的地址信息,此时双方都知道和谁建立了连接,这就是有连接的通信。在之前的 UDP 数据报套接字编程中就提到过 UDP 是无连接的,所以在发送数据报的时候要加上对端的信息,防止丢包。
可靠传输是通过各种手段来防止丢包的出现,而不可靠传输则没有做任何处理直接把数据报传输过去。但是可靠传输不意味着能 100% 把数据报完整无误地传输给对方,只是尽可能降低丢包发生的概率,并且可靠传输是要使用很多手段来保持的,所以付出的代价相比于不可靠传输要大。
面向字节流就是以字节为单位来进行数据的传输,面向数据报就是以数据报为单位进行数据的传输。
全双工就是通信的双发可以同时给对方发送数据,但是半双工是指双方只有一方可以发送数据。
TCP 流套接字 API 介绍
ServerSocket
ServerSocket 是 TCP 服务端 Socket 的 API。
构造方法:
| 方法名 | 说明 |
|---|---|
| ServerSocket(int port) | 创建一个 TCP 服务端流套接字 Socket,并绑定端口号 |
ServerSocket 方法:
| 方法名 | 返回值 | 说明 |
|---|---|---|
| accept() | Socket | 开始监听指定端口(创建时绑定的端口),有客户端连接后,返回一个服务端 Socket 对象,并基于该 Socket 建立与客户端的连接,否则阻塞等待 |
| close() | void | 关闭此套接字 |
Socket
Socket 是客户端 Socket 或者是服务端那边收到客户端建立连接的请求(通过 accept() 方法)返回的 Socket 对象。
不管是客户端还是服务端的 Socket 对象,他们都保留了对端的地址信息,这也是 TCP 协议有连接的体现。
Socket 构造方法:
| 方法名 | 说明 |
|---|---|
| Socket(String host, int port) | 创建一个客户端流套接字 Socket,并于对应 IP 的主机对应的端口的进程建立连接 |
Socket 方法:
| 方法名 | 返回值 | 说明 |
|---|---|---|
| getInetAddress() | InetAddress | 返回套接字所连接的地址 |
| getInputStream() | InputStream | 返回此套接字的输入流 |
| getOutputStream() | OutputStream | 返回此套接字的输出流 |
回显服务器
首先在回显服务器的构造方法里初始化我们的 ServerSocket。
public class TcpEchoServer {
private ServerSocket serverSocket;
IOException {
serverSocket = (port);
}
IOException {
System.out.println();
Executors.newCachedThreadPool();
() {
serverSocket.accept();
executorService.submit(() -> {
{
processClient(clientSocket);
} (IOException e) {
(e);
}
});
}
}
IOException {
( clientSocket.getInputStream();
clientSocket.getOutputStream()) {
System.out.printf(, clientSocket.getInetAddress(), clientSocket.getPort());
(inputStream);
(outputStream);
() {
(!scanner.hasNext()) {
System.out.printf(, clientSocket.getInetAddress(), clientSocket.getPort());
;
}
scanner.next();
process(request);
writer.println(response);
writer.flush();
System.out.printf(, clientSocket.getInetAddress(), clientSocket.getPort(), request, response);
}
} (IOException e) {
(e);
} {
clientSocket.close();
}
}
String {
request;
}
IOException {
();
server.start();
}
}


