目录
[TCP客户端代码解析 :](#TCP客户端代码解析 :)
背景:
如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面将编写两个简单的Java程序来展示TCP通信的基本原理。
TCP服务代码解析:
TCP服务器的代码:
java
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String[] args) throws Exception {
// 创建一个ServerSocket对象,监听6666端口
ServerSocket ss = new ServerSocket(6666);
// 无限循环,等待客户端连接
while (true) {
// 当有客户端连接时,accept()方法返回一个新的Socket对象
Socket s = ss.accept();
// 从Socket中获取输入流,并使用DataInputStream进行封装
DataInputStream dis = new DataInputStream(s.getInputStream());
// 从输入流中读取UTF字符串并打印
String message = dis.readUTF();
System.out.println("Received from client: " + message);
// 关闭流和Socket连接
dis.close();
s.close();
}
}
}
服务器程序的工作流程:
1.创建一个ServerSoket对象,监听指定的端口(这里6666)
2.进入无限循环,等待客户端的连接
3.当有客户端时,accept()方法会返回一个新的Socket独享
4.从这个Socket对象中获取输入流,并使用DataInputStream进行封装
5.读取输入流中的UTF字符串,并打印到控制台
6.关闭输入流和Socket连接
TCP客户端代码解析 :
TCP客户端代码:
java
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String[] args) throws Exception {
// 创建一个Socket对象,连接到服务器的指定IP和端口
Socket s = new Socket("127.0.0.1", 6666);
// 从Socket中获取输出流,并使用DataOutputStream进行封装
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// 向输出流中写入UTF字符串
dos.writeUTF("hello server!");
// 刷新输出流,确保数据被发送
dos.flush();
// 关闭输出流和Socket连接
dos.close();
s.close();
}
}
客户端工作流程:
1.创建一个Socket对象,连接到服务器的指定IP和端口(这里是127.0.0.1和666)
2.从这个Socket对象中获取输出流,并使用DataOuptStream进行封装
3.向输出流中写入UTF字符串
3.刷新输出流,确保数据被发送到服务器
5.关闭输出流和Socket连接
总结:
类别 | TCP服务器 | TCP客户端 |
---|---|---|
功能 | 监听指定端口,等待客户端连接,处理客户端发送的数据 | 连接到服务器,发送数据到服务器 |
主要类 | ServerSocket |
Socket |
创建方式 | ServerSocket ss = new ServerSocket(port); |
Socket s = new Socket(host, port); |
监听端口 | 通过ServerSocket 构造函数指定 |
无需监听,连接到服务器的指定端口 |
数据接收 | 使用ServerSocket 的accept() 方法等待客户端连接,然后获取Socket 对象的InputStream 进行读取 |
使用Socket 对象的getOutputStream() 获取输出流,然后写入数据 |
数据发送 | 无需直接发送数据,而是从客户端接收数据 | 使用Socket 对象的getOutputStream() 获取输出流,并使用DataOutputStream 或其他包装类写入数据 |
数据读取 | 使用Socket 对象的getInputStream() 获取输入流,并使用DataInputStream 或其他包装类读取数据 |
无需直接读取数据,而是将数据发送到服务器 |
关闭连接 | 关闭Socket 对象的输入流和Socket 本身 |
关闭Socket 对象的输出流和Socket 本身 |
注意事项 | 1.需要处理并发连接(例如使用多线程) 2.需要处理可能的异常和错误 3.可能需要设置超时和缓冲区大小 | 1.需要确保服务器正在运行并监听指定端口 2.需要处理可能的异常和错误 3.可能需要设置超时和缓冲区大小 |
通过上面的示例,Java中TCP服务器和客户端的基本实现。服务监听一个端口,等待客户端的连接,当客户端连接后,双方可以通过Socket 对象进行数据的读写,这里使用DataInputStream和DataOutputeam来封装输入流和输出流,以便更好的读取和写入UTF字符串,