首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 與 C# Socket 通訊:TCP 文本收發核心代碼範例 (含編碼、換行、緩衝處理)

     編輯:程式設計綜合問答

協議約定

  • 編碼:UTF-8
  • 訊息分隔:\n (單行文本)
  • 連線保持:長連接,雙向收發

Java 伺服端 (Server)


public class JavaServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket server = new ServerSocket(8888)) {
            System.out.println("Java Server listening on 8888...");
            while (true) {
                Socket client = server.accept();
                new Thread(() -> handle(client)).start();
            }
        }
    }

    static void handle(Socket socket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
             PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true)) {

            String line;
            while ((line = in.readLine()) != null) { // 讀取以 \n 結尾的行
                System.out.println("Recv from C#: " + line);
                // 回覆
                out.println("Java Echo: " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

C# 客戶端


using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class CSharpClient {
    public static void Main() {
        using (TcpClient client = new TcpClient("127.0.0.1", 8888))
        using (NetworkStream stream = client.GetStream())
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
        using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true }) {

            // 發送
            writer.WriteLine("Hello from C#");
            // 接收
            string reply = reader.ReadLine();
            Console.WriteLine("Recv from Java: " + reply);

            // 持續互動
            while (true) {
                Console.Write("> ");
                string input = Console.ReadLine();
                if (input == "exit") break;
                writer.WriteLine(input);
                Console.WriteLine("Server: " + reader.ReadLine());
            }
        }
    }
}

關鍵細節

問題Java 處理C# 處理
編碼不一致StandardCharsets.UTF_8Encoding.UTF8
訊息邊界readLine() / println() 自動處理 \nReadLine() / WriteLine()
緩衝區未刷新PrintWriter(..., true) 自動 flushAutoFlush = true
半包/黏包行協議天然解決 (單行業務)同左
異常斷開readLine() == null 檢測ReadLine() == null

擴展:二進制/長訊息協議

若需傳輸 JSON/Protobuf 等二進制資料,改用「長度前綴 (4 bytes) + Payload」協議,雙端用 DataInputStream/BinaryReader 讀寫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved