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

Java 客戶端調用 C 服務端:Socket 通信另一種實現方式

     編輯:Java 相關知識

場景

同 上文,但採用不同的讀寫流組合:Java 端使用 BufferedReader 逐行讀取,C 端持續發送時間戳直到連接關閉。

Java 客戶端

import java.io.*;
import java.net.*;

public class ClientDemo {
    public static void main(String[] args) {
        try (Socket socket = new Socket("127.0.0.1", 8888);
             InputStream is = socket.getInputStream();
             InputStreamReader isr = new InputStreamReader(is);
             BufferedReader br = new BufferedReader(isr)) {

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println("Received: " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

C 服務端

#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);

    for (;;) {
        connfd = accept(listenfd, (SA*)NULL, NULL);
        for (;;) {
            ticks = time(NULL);
            snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
            write(connfd, buff, strlen(buff));
            sleep(1);  // 每秒發送一次
        }
        close(connfd);  // 理論上不可達
    }
}

差異說明

  • C 端改為持續發送(每秒一次),Java 端 while ((line = br.readLine()) != null) 循環接收,直到對端關閉連接(readLine 返回 null)。
  • 適合「服務端推送、客戶端持續消費」模型(如行情推送、日誌流)。

注意事項

  1. C 端 write 可能發送不完整,生產代碼應檢查返回值並循環發送剩餘數據。
  2. Java 端未發送數據給服務端,屬於單向通信;若需雙向,參考上文雙向示例。
  3. 長連接需處理「寫端關閉、讀端阻塞」等半關閉狀態,建議應用層心跳檢測。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved