演示 C 語言 TCP 服務端 與 Java TCP 客戶端 通過 Socket 交換文本消息,驗證跨語言、跨平台網絡互通性。
#include "unp.h"
#include <time.h>
#include <stdio.h>
int main(int argc, char **argv) {
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8888);
bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
listen(listenfd, 5);
printf("Server listening on port 8888...\n");
for (;;) {
connfd = accept(listenfd, (SA*)NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff)); // 發送當前時間
close(connfd); // 簡化:單次請求即斷開
}
}
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class ClientDemo {
public static void main(String[] args) {
try (Socket socket = new Socket("127.0.0.1", 8888);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(System.in)) {
// 接收服務端發送的時間
String serverTime = in.readLine();
System.out.println("Server time: " + serverTime);
// 交互式發送消息
System.out.print("Enter message (bye to quit): ");
while (scanner.hasNextLine()) {
String msg = scanner.nextLine();
out.println(msg);
if ("bye".equalsIgnoreCase(msg)) break;
System.out.print("Enter message (bye to quit): ");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
htons/htonl 轉網絡序,Java Socket 內部自動處理,無需額外操作。\r\n,Java BufferedReader.readLine() 自動識別 \n/\r\n。PrintWriter(true) 啟用自動刷新,確保 println 即時發送。PING/PONG 檢測存活。SocketTimeoutException、ConnectionResetException,實現重連邏輯。SSLSocket)。