啟動服務器端,客戶端啟動后服務器端控制臺列印輸出"你好服務器"
客戶端一直卡在is.read(bytes)方法這導致客戶端無法在控制臺列印輸出"收到訪問",沒有任何報錯。客戶端和服務器端的服務一直無法停止。
客戶端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",9999);
OutputStream os = socket.getOutputStream();
os.write("你好服務器".getBytes());
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
while((len=is.read(bytes))!=-1) {
System.out.println(new String(bytes,0,len));
}
socket.close();
}
}
服務器端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
while((len=is.read(bytes))!=-1) {
System.out.println(new String(bytes,0,len));
}
OutputStream os = socket.getOutputStream();
os.write("收到訪問".getBytes());
socket.close();
serverSocket.close();
}
}
uj5u.com熱心網友回復:
服務端進入死回圈,一直在等待客戶端發送資料SocketInputStream.read 方法不會回傳 -1。它不象檔案流,檔案存盤在本地,是很容易知道檔案是否已經讀到最后一個位元組的。而對于 socket 流,它不無法知道資料是否已經讀完了,因為這是TCP/IP協議決定的。
所以這類基于TCP/IP的通信,一般會有一種機制,一般是定義一個資料包頭,從發送端告訴接收端,我準備發送多少個位元組的資料,然后才發送資料。接收端在先讀并且決議資料包頭,然后知道這次需要接收多少資料,然后接收資料,并且要對收到的資料的位元組數進行計數,收完了就繼續后面的邏輯。這個機制叫通信協議。
uj5u.com熱心網友回復:
感恩感恩


uj5u.com熱心網友回復:
網路通信程序中,TCP連接,作業系統底層會建立 發送和接收資料的緩沖區。客戶端在發送資料之后,要重繪緩沖區,就像沖馬桶一樣,把資料刷出去。
請呼叫flush函式。
同理,如果服務端向客戶端發送資料之后,也要進行flush操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/12770.html
標籤:Java SE
