![](/img/trans.png)
[英]My server will freeze if the client just does a connection and does not send any data
[英]Client does not send data to server
即使使用此非常基本的客戶端服務器應用程序,我也遇到問題。 客戶端未發送數據/服務器未接收。 我不明白問題出在哪里。 我什至開始認為我對套接字一無所知。
這是服務器代碼:
public class Server
{
public static void main(String args[])
{
try{
ServerSocket serverSocket = new ServerSocket(3000);
Socket socket = serverSocket.accept();
System.out.println("Client connected: "+socket.getInetAddress.toString());
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
System.out.println(scanner.nextLine());
}
}catch(IOException e)
{
System.out.println("error");
}
}
}
這是客戶端代碼:
public class Client
{
public static void main(String args[])
{
Socket socket;
PrintWriter printWriter;
try {
socket = new Socket("127.0.0.1", 3000);
printWriter = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
printWriter.write("frejwnnnnnnnnnnnnnnnnnnnnnnnnosfmxdawehtcielwhctowhg,vort,hyvorjtv,h");
printWriter.flush();
}
}catch(IOException e)
{
System.out.print("error\n");
}
}
}
如果我都在同一台計算機上運行,則服務器正確打印“客戶端已連接.....”,但隨后不再打印。
問題是什么?
服務器讀取下一行 。 客戶端不發送任何行尾。 因此,服務器可能無法知道該行應該結束,並阻塞直到在流中找到EOL為止。 或直到客戶端關閉其套接字。
在客戶端代碼中,您可以使用PrintWriter
裝飾輸出流,以便可以使用println
。 更換
printWriter.write("frejwnnnnn...rjtv,h");
printWriter.flush();
通過:
printWriter.println("frejwnnnnn...rjtv,h");
沖洗是沒有用的,因為有請求自動沖洗(在PrintWriter構造函數中為true)。
在服務器代碼中,可以使用BuffererdReader裝飾器代替Scanner:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.