目录
背景:
TCP服务代码解析:
TCP服务器的代码:
服务器程序的工作流程:
TCP客户端代码解析 :
TCP客户端代码:
客户端工作流程:
总结:
背景:
如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面将编写两个简单的Java程序来展示TCP通信的基本原理。
TCP服务代码解析:
TCP服务器的代码:
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客户端代码:
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字符串,