socket 编程
理解 TCP Socket 通信原理
掌握服务端和客户端的编写
实现简单的双向通信
核心讲解
(1)Socket 编程
套接字编程,实现两台机器之间的网络通信,TCP 是面向连接的可靠传输。
服务端:ServerSocket,监听端口,等待连接
客户端:Socket,连接服务端
输入输出流:连接成功后,通过流来收发数据
(2)TCP 通信流程
服务端:
创建 ServerSocket,绑定端口
accept () 等待客户端连接,阻塞
连接成功获取 Socket
通过输入输出流收发数据
关闭连接
客户端:
创建 Socket,连接服务端 IP 和端口
获取输入输出流
收发数据
关闭
(3)多客户端处理
服务端用多线程,每个客户端一个线程,不然只能服务一个客户端。
代码示例
// ===== 服务端 =====
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务端启动,监听8888端口...");
// 等待客户端连接
Socket socket = server.accept();
System.out.println("客户端连接:" + socket.getInetAddress());
// 获取输入流,读取客户端数据
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 获取输出流,发送数据
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String msg = reader.readLine();
System.out.println("收到:" + msg);
// 回复
writer.println("收到:" + msg);
reader.close();
writer.close();
socket.close();
server.close();
}
}
// ===== 客户端 =====
import java.io.*;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException {
// 连接服务端
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 发送消息
writer.println("Hello Server!");
// 接收回复
String reply = reader.readLine();
System.out.println("服务端回复:" + reply);
reader.close();
writer.close();
socket.close();
}
}
常见误区
端口被占用:启动服务端端口被占用,换端口或者关闭占用程序
忘记 flush:输出流写完要 flush,或者 PrintWriter 设置 autoFlush 为 true
服务端只能连一个:单线程的服务端只能处理一个客户端,要多客户端必须用多线程
关闭顺序错:先创建的后关闭,后创建的先关闭
课后练习
编写 TCP 服务端和客户端,客户端发消息,服务端转大写返回
改造服务端,支持多客户端同时连接
实现一个简单的文件传输功能
思考:TCP 和 UDP 的区别是什么?

