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

Java Socket 字節流傳輸完整示例:服務端與客戶端雙向通信

     編輯:Java 綜合教學

Java Socket 字節流傳輸完整示例:服務端與客戶端雙向通信

基於原始 Socket 與 ServerSocket 實現字節級數據傳輸,服務端使用 BufferedInputStream + DataInputStream 讀取,客戶端使用 DataOutputStream 發送,含十六進制調試輸出工具方法。

服務端代碼


public class TalkServer4Byte {
    private ServerSocket server;
    private int port = 5020;

    public TalkServer4Byte() {
        try { server = new ServerSocket(port); }
        catch (IOException e) { e.printStackTrace(); }
    }

    public void talk() {
        System.out.println("監聽端口: " + port);
        while (true) {
            try (Socket socket = server.accept()) {
                System.out.println("客戶端連接: " + socket.getRemoteSocketAddress());
                
                BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
                DataInputStream dis = new DataInputStream(bis);
                byte[] buffer = new byte[1];
                StringBuilder hexLog = new StringBuilder();
                
                while (dis.read(buffer) != -1) {
                    hexLog.append(bytesToHexString(buffer)).append(" ");
                    if (dis.available() == 0) {  // 一個請求讀取完畢
                        doSomething(hexLog.toString());
                        hexLog.setLength(0);
                    }
                }
            } catch (IOException e) { e.printStackTrace(); }
        }
    }

    private static void doSomething(String hex) {
        System.out.println("收到數據: " + hex);
    }

    // 字節數組轉十六進制字符串 (大寫、雙位補零)
    public static String bytesToHexString(byte[] src) {
        StringBuilder sb = new StringBuilder();
        for (byte b : src) {
            String hv = Integer.toHexString(b & 0xFF);
            if (hv.length() < 2) sb.append('0');
            sb.append(hv.toUpperCase());
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        new TalkServer4Byte().talk();
    }
}

客戶端代碼


public class TalkClient4Byte {
    private Socket socket;

    public TalkClient4Byte() {
        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress("127.0.0.1", 5020), 1000);
        } catch (IOException e) { e.printStackTrace(); }
    }

    public void talk() {
        try (DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
             DataInputStream dis = new DataInputStream(System.in)) {
            byte[] buffer = new byte[1];
            while (dis.read(buffer) != -1) {
                dos.write(buffer);  // 逐字節發送
            }
            dos.flush();
        } catch (IOException e) { e.printStackTrace(); }
    }

    public static void main(String[] args) {
        new TalkClient4Byte().talk();
    }
}

關鍵技術點

  • 字節流 vs 字符流:示例使用 InputStream/OutputStream 體系,適合二進制協議/文件傳輸;文本協議建議用 Reader/Writer 或 BufferedReader/PrintWriter
  • 幂等讀取:dis.available() == 0 判斷單次請求結束,適用於定長/無分隔符協議;生產環境建議使用長度前綴或分隔符幂等解析
  • 十六進制調試:bytesToHexString 將不可見字節可視化,便於協議調試
  • 資源管理:JDK 7+ try-with-resources 自動關閉 Socket/流,防止洩漏

擴展建議

  1. 引入 Netty/Mina 等 NIO 框架替換阻塞 IO,支撐高併發
  2. 定義應用層協議 (Protobuf/JSON/自定義二進制),實現編解碼器
  3. 添加心跳、重連、TLS 加密等生產級特性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved