同 上文,但採用不同的讀寫流組合:Java 端使用 BufferedReader 逐行讀取,C 端持續發送時間戳直到連接關閉。
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();
}
}
}
#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); // 理論上不可達
}
}
while ((line = br.readLine()) != null) 循環接收,直到對端關閉連接(readLine 返回 null)。write 可能發送不完整,生產代碼應檢查返回值並循環發送剩餘數據。