首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

C 與 Java 跨語言 Socket 通信實戰:TCP 服務端與客戶端完整示例

     編輯:Java 相關知識

場景說明

演示 C 語言 TCP 服務端 與 Java TCP 客戶端 通過 Socket 交換文本消息,驗證跨語言、跨平台網絡互通性。

C 服務端代碼(Linux/Unix,基於 unp.h)

#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);  // 簡化:單次請求即斷開
    }
}

Java 客戶端代碼

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();
        }
    }
}

關鍵互通要點

  1. 字節序:C 端使用 htons/htonl 轉網絡序,Java Socket 內部自動處理,無需額外操作。
  2. 換行符:C 端發送 \r\n,Java BufferedReader.readLine() 自動識別 \n/\r\n。
  3. 編碼一致:雙方均使用平台默認編碼(或顯式指定 UTF-8),避免中文亂碼。
  4. 緩衝區刷新:Java PrintWriter(true) 啟用自動刷新,確保 println 即時發送。

擴展建議

  • 實現長連接心跳:雙方定時發送 PING/PONG 檢測存活。
  • 應用層協議:定義消息頭(長度、類型、序列號),解決 TCP 粘包/拆包問題。
  • 異常處理:捕獲 SocketTimeoutException、ConnectionResetException,實現重連邏輯。
  • 安全加固:引入 TLS/SSL(C 端用 OpenSSL,Java 端用 SSLSocket)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved