用java代码给传输的数据设计一个通信协议代码案例
时间: 2023-06-13 09:05:25 浏览: 48
以下是一个简单的基于Java的通信协议代码案例:
```java
// 定义通信协议
public class Protocol {
public static final String DELIMITER = "|"; // 分隔符,用于分割不同的数据字段
public static final int MESSAGE_FIELD_COUNT = 2; // 数据字段数量
// 构造函数
private Protocol() {}
// 将数据打包为字符串
public static String pack(String message, String sender) {
return message + DELIMITER + sender;
}
// 将字符串解包为数据
public static String[] unpack(String data) throws ProtocolException {
String[] fields = data.split("\\" + DELIMITER); // 使用转义字符来避免正则表达式的错误
if (fields.length != MESSAGE_FIELD_COUNT) {
throw new ProtocolException("Invalid data format: " + data);
}
return fields;
}
}
// 定义自定义的通信协议异常
public class ProtocolException extends Exception {
public ProtocolException(String message) {
super(message);
}
}
// 客户端代码示例
public class Client {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
// 连接到服务器
public void connect(String host, int port) throws IOException {
socket = new Socket(host, port);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
}
// 发送消息
public void sendMessage(String message, String sender) throws IOException {
String data = Protocol.pack(message, sender);
writer.println(data);
writer.flush();
}
// 接收消息
public String[] receiveMessage() throws IOException, ProtocolException {
String data = reader.readLine();
return Protocol.unpack(data);
}
// 关闭连接
public void disconnect() throws IOException {
socket.close();
}
}
// 服务器端代码示例
public class Server {
private ServerSocket serverSocket;
// 启动服务器
public void start(int port) throws IOException {
serverSocket = new ServerSocket(port);
}
// 接收客户端连接
public Socket accept() throws IOException {
return serverSocket.accept();
}
// 处理客户端请求
public void handleClient(Socket socket) throws IOException, ProtocolException {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
while (true) {
String data = reader.readLine();
String[] fields = Protocol.unpack(data);
String message = fields[0];
String sender = fields[1];
System.out.println("Received message from " + sender + ": " + message);
writer.println("Message received.");
writer.flush();
}
}
// 关闭服务器
public void stop() throws IOException {
serverSocket.close();
}
}
```
这个通信协议的实现很简单,它将消息和发送者的名称打包为一个字符串,使用竖线字符作为分隔符。在客户端发送消息时,它会调用 `Protocol.pack()` 方法将消息和发送者名称打包为一个字符串,并发送到服务器。在服务器端,它会调用 `Protocol.unpack()` 方法解包接收到的数据,并将消息和发送者名称打印到控制台上。然后服务器会发送一个确认消息给客户端,告诉它已经接收到了消息。如果在解包数据时发生错误,它会抛出一个 `ProtocolException` 异常,客户端和服务器都需要处理这个异常。