2013-11-20 67 views
0

我試圖通過與一個客戶端和服務器的套接字聊天工作。我已經成功地運行了它,因爲服務器能夠來回傳遞消息,但是當我嘗試使服務器端實現稍微複雜一些時,添加命令等,客戶端可以使用,通信失敗。它看起來可能會不同步,即使反覆使用相同的命令可能產生不同的結果,即使我在每個命令之後刷新了所有內容。Java套接字聊天不顯示所有消息

簡單輸出的例子,這正常工作,每次:

客戶:

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

public class Test1Client 
{ 
public static void main(String args[]) 
{ 


    InputStreamReader convert = new InputStreamReader(System.in); 
    BufferedReader stdin = new BufferedReader(convert); 

    try 
    { 
     Socket echoClient = new Socket("localhost", 17); 
     PrintStream outs = new PrintStream(echoClient.getOutputStream()); 
     BufferedReader ins = new BufferedReader(new InputStreamReader(echoClient.getInputStream())); 
     while(true){ 
     System.out.print("Type whatever you want: "); 
     String line = stdin.readLine(); 
     outs.println(line); 
     System.out.println("Server says: " + ins.readLine()); 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.println(e); 
    } 
} 
} 

服務器:

import java.net.*; 
import java.util.ArrayList; 
import java.io.*; 


public class Test1Server 
{ 
    public static void main(String args[]) 
    { 
     try 
     { 
      ServerSocket socket= new ServerSocket(12167); 
      //Try not to use port number < 2000. 
      System.out.println("Waiting for a client to connect..."); 
      Socket s = socket.accept(); 
      System.out.println("Client Connected."); 
      BufferedReader ins = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      PrintStream outs = new PrintStream(s.getOutputStream());     

     while (true) 
      { 

      String line = ins.readLine(); 
      outs.println(line); 

     } 

    } 
    catch (IOException e) 
     { 
      e.getStackTrace(); 
     } 
    } 
} 

我得到的輸出是這樣,它的工作原理每次只吐出它:

Type whatever you want: login 
Server says: login 
Type whatever you want: login 
Server says: login 
Type whatever you want: login 
Server says: login 
Type whatever you want: login 
Server says: login 

但是,當我做服務器端更復雜一點用以下替換其while(true)塊,我得到一個更加混亂的結果:

   String line = ins.readLine(); 
       String response = manager.process(line); 
       outs.println(response); 
       outs.flush(); 

過程:

msg= "User logged in successfully \n"; 
return msg; 

你也請注意流程命令代碼中的一些註釋行。當我給回一個簡單的信息的服務器似乎跟上,但是當我使用的登錄功能以及它給這樣可怕的輸出:

Type whatever you want: login ryanne 
Server says: ryanne logged in successfully 
Type whatever you want: login ryanne 
Server says: 
Type whatever you want: login ryanne 
Server says: You may already be logged in or did not use correct username or password 
Type whatever you want: login ryanne 
Server says: 
Type whatever you want: newuser jeff 
Server says: You may already be logged in or did not use correct username or password 
Type whatever you want: newuser jeff 12345 
Server says: 
Type whatever you want: new user jeff 12345 
Server says: You may already be logged in or did not use correct username or password 
Type whatever you want: 

同樣,在沒有從服務器回來注意到空白,然後即使命令中的更改也不會提示不同的響應。就好像它不同步一樣,只需使用一個附加功能?

+0

似乎你的服務器端代碼是一樣的客戶端端? :)我猜錯了粘貼在那裏。 –

+0

您已在'客戶端'和'服務器'下發布相同的代碼 –

+0

@PeterButkovic已修復!對於那個很抱歉! – ZAX

回答

2

你有一些字符串的結尾有些"\n"。 如果您同時輸入"\n"並使用println,則您將有雙重回車,這會弄亂您的協議。刪除"\n"的,它應該更好地工作。

+0

不能相信這是問題!非常感謝!我不知道有關println的警告! – ZAX

+0

@弗拉維奧很漂亮! –

1

也許,您發送的數據沒有被刷新。使用outs.flush();outs.println(line);後或改變它的構造函數調用PrintStream(echoClient.getOutputStream(),true);(啓用自動沖洗打印上新的生產線)

+0

在替換代碼中,對於服務器,我更「複雜」的版本,如果你將我替換while循環,我使用outs.flush(),你建議我不?雖然沒有發佈,但我確實有一個稍微複雜一點的客戶端版本,其中也包含outs.flush()方法:/任何其他想法或者其他方法?其驅使我瘋狂 – ZAX