基於經典 TCP Echo 伺服器/客戶端範例,客戶端發送字串「ab」,預期伺服端回傳「ba」(字元反轉)或大寫「AB」。
在讀取客戶端資料後、寫回前,插入反轉處理:
while ((recvMsgSize = in.read(byteBuffer)) != -1) {
byte[] changed = reverseBytes(byteBuffer, recvMsgSize);
out.write(changed, 0, recvMsgSize);
}
// 反轉輔助方法
private static byte[] reverseBytes(byte[] src, int len) {
byte[] dst = new byte[len];
for (int i = 0; i < len; i++) {
dst[i] = src[len - 1 - i];
}
return dst;
}
package com.test.jvm;
import java.net.*;
import java.io.*;
public class TCP_Server {
private static final int BUFSIZE = 32;
public static void main(String[] args) throws IOException {
if (args.length != 1) throw new IllegalArgumentException("Parameter(s): ");
int servPort = Integer.parseInt(args[0]);
ServerSocket servSock = new ServerSocket(servPort);
byte[] byteBuffer = new byte[BUFSIZE];
for (;;) {
Socket clntSock = servSock.accept();
System.out.println("Handling client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort());
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
int recvMsgSize;
while ((recvMsgSize = in.read(byteBuffer)) != -1) {
byte[] changed = reverseBytes(byteBuffer, recvMsgSize);
out.write(changed, 0, recvMsgSize);
}
clntSock.close();
}
}
private static byte[] reverseBytes(byte[] src, int len) {
byte[] dst = new byte[len];
for (int i = 0; i < len; i++) dst[i] = src[len - 1 - i];
return dst;
}
}
原 Echo 客戶端即可驗證:輸入「ab」將收到「ba」。
new String(byteBuffer, 0, recvMsgSize).toUpperCase().getBytes()。BufferedReader/PrintWriter 處理行導向文字協定。read() 回傳實際讀取位元組數,必須配合長度處理。透過微調 Echo 範例,快速掌握伺服端資料處理與回傳的核心流程。