2013-10-01 105 views
1

書面形式向客戶端套接字所以我想創建一個簡單的服務器客戶端程序,其中多個客戶端可以連接到一臺服務器的麻煩。我在客戶端和服務器端運行線程。我有一個文件「loginuser.txt」,它有5行文本。這段代碼是服務器線程。當我調用outToClient.println(「xxx」)或其他任何東西時,客戶端一次不會收到超過一行的內容。每次用戶在鍵盤上輸入任何內容(在客戶端上)時,文件的下一行都顯示在同一個終端上。有人能告訴我爲什麼會發生這種情況嗎?我哪裏錯了? 基本問題:對於從服務器到客戶端的單行println(),似乎我必須每次在客戶端輸入一些內容。客戶套接字編程在Java中 - 從服務器端

BufferedReader inFromUser=new BufferedReader(new InputStreamReader(System.in)); 
BufferedReader inFromClient=new BufferedReader(new InputStreamReader(client.getInputStream())); 
BufferedReader userlogr=new BufferedReader(new FileReader("loginuser.txt")); 
PrintWriter outToClient = new PrintWriter(client.getOutputStream(), true); 
if(check==1) 
    { 
     fromclient=inFromClient.readLine(); 
     if(fromclient.compareTo("xxx")==0) 
     { 
      String line; 
      while((line=userlogr.readLine())!=null) 
      { 
       System.out.println(line); 
       outToClient.println(line); 
       outToClient.flush(); 
      } 

     } 
    } 
+2

聽起來就像是客戶端的問題。它處於暫停輸入的循環中,並且只有一個線程處理用戶輸入和從服務器接收數據。編輯您的帖子並顯示客戶端代碼。 –

+0

聽起來像一個協議問題(你的協議)。我的猜測是,客戶端只爲它發送的每一行讀取一行。如果你想在一個響應中發送多行,你需要有其他方式來知道你什麼時候收到完整的消息。 –

+0

你可以顯示相應的客戶端代碼嗎? – Fildor

回答

0

我以前有過這個問題。通常有三件事

1.)同時檢查發送的字符串「\ n」最後。使用\ n和println會弄亂回車,因爲它會加倍。刪除任何額外的「\ n」並嘗試它(這很可能是您的情況中的問題)

2.)客戶端確實沒有一個while循環來輸出傳遞的整個數據。您正逐行發送數據。收到數據後檢查客戶端是否自行關閉。

3)在客戶端檢查線程。我不知道你的客戶端線程是如何工作的,但我曾經被其他線程阻塞。