2017-03-06 10 views
0

私は単純なチャットを行っています。クライアント側では、ソケットなどの作成を管理するConnectionManagerクラスがあります。ここではコアメソッドです:java - サーバーがクライアントからのメッセージを受信して​​いません(reader.readLine()== null?)

public class ConnectionManager { 
    private Socket socket; 
    private BufferedReader reader; 
    private PrintWriter writer; 

    public ConnectionManager(String URL, int port){ 
     tryConnectToServer(URL, port); 
    } 

    public BufferedReader getReader() { 
     return reader; 
    } 

    public PrintWriter getWriter() { 
     return writer; 
    } 
    private void tryConnectToServer(String ip, int servSocket) { 
     try{ 
      socket = new Socket(ip, servSocket); 
      writer = new PrintWriter(socket.getOutputStream()); 
      reader = new BufferedReader(
        new InputStreamReader(
          socket.getInputStream())); 
     } 
     catch (IOException ex){ 
      System.out.println("Unable to connect to specified server. Code pink"); 
      ex.printStackTrace(); 
     } 
    } 

Connection ManagerオブジェクトはChatGUIの一部です。 ChatGUIのフィールドライタ及びリーダはSendButtonListenerに得られ、ChatGUIのJTextFieldの(msgInput)と共にライタを通過するために、CMから設定されている:

private void addSendButton() { 
    JButton sendButton = new JButton("Send"); 
    sendButton.addActionListener(new SendButtonActionListener(writer, msgInput)); 
    panel.add(sendButton); 
    panel.add(this.msgArea); 
} 

そして、actionPerformedメソッドを行います

public class SendButtonActionListener implements ActionListener{ 
private PrintWriter writer; 
private JTextField msgInput; 

public SendButtonActionListener(PrintWriter pr, JTextField mi){ 
    writer = pr; 
    msgInput = mi; 
} 

public void actionPerformed(ActionEvent event){ 
    writer.println(msgInput.getText()); 
    System.out.println("Sending: " + msgInput.getText()); 
    flushMessageInputField(); 
} 

private void flushMessageInputField(){ 
    msgInput.setText(""); 
} 

}

サーバ側では、私はこれを持っています:

try{ 
     this.servSocket = new ServerSocket(port); 
     System.out.println("Server socket established"); 
    } 
    catch (IOException ex){ 
     System.out.println("Unable to establish server socket. Code pink \n"); 
     ex.printStackTrace(); 
    } 

そして、上記した後、これを来る:

public void waitForClients(){ 
    System.out.println("The gates has been opened..."); 
    while (true){ 
     try { 
      Socket client = servSocket.accept(); 
      processClient(client); 
     } 
     catch (IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 

private void processClient(Socket client){ 
    writers.add(getClientWriter(client)); 
    startUpdateFrom(client); 
    System.out.println("New client connected: " + client.getPort()); 
} 

private PrintWriter getClientWriter(Socket client){ 
    try{ 
     return new PrintWriter(client.getOutputStream()); 
    } 
    catch (Exception ex){ 
     ex.printStackTrace(); 
    } 
    return null; 
} 

そして最後に、新しいスレッドがそのクライアントから新しいメッセージを聞くことを開始します。

public class WaitAndSendToAllFrom implements Runnable{ 
    BufferedReader reader; 

    public WaitAndSendToAllFrom(Socket clientSocket){ 
     try{ 
      reader = new BufferedReader(
        new InputStreamReader(
          clientSocket.getInputStream())); 
     } 
     catch (IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 

    public void run(){ 
     try{ 
      String message; 
      System.out.println("Thread: waiting for messages to send..."); 
      while (true){ 
       message = reader.readLine(); 
       while (message != null){ 
        System.out.println("Server: Sending message: " + message); 
        sendToAll(message); 
       } 
      } 
     } 
     catch (IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 

    private void sendToAll(String message){ 
     List<PrintWriter> writers = ServerClientConnector.getWriters(); 
     for (PrintWriter pr : writers){ 
      pr.println(message + "\n"); 
      pr.flush(); 
     } 
    } 
} 

:ある

private void startUpdateFrom(Socket client){ 
    new Thread(
      new WaitAndSendToAllFrom(client)) 
       .start(); 
} 

サイクルは「スレッド:メッセージの送信を待っています...」になりますが、それ以上はないので、reader.readLine()はヌル(sysout :)でチェックされます)を返します。私はそれをデバッグしようとしていましたが、私はあまりプログラミングに慣れていません。特に、お互いに働く2つの別々のコードをデバッグしてください。私は3日間これを見てきました。私は真剣にここにこだわっています。

+0

あなたにも、クライアントからメッセージを送信するコードを投稿することができますか?ところで、あなたは 'WaitAndSendToAllFrom-> run-> while(message!= null)'に無限ループを持っています - while.loopの中でメッセージが変化することはないので、永遠にループしてループします(たとえ、あなたが求めた問題は、次の問題かもしれません)。 –

+0

私は投稿を編集しましたが、書くのはあまりありませんでしたが、それはすべてが必要だと信じています:)他のバグやエラーのために事前に - 私は、コードをリルビットとリファクタリングする必要があることを知っていますが、今はそれらの気がするソケット/リーダー/ライターに集中しています:)。 –

答えて

0
while (true){ 
    message = reader.readLine(); 
    while (message != null){ 
     System.out.println("Server: Sending message: " + message); 
     sendToAll(message); 
    } 
} 

これは意味をなさない。あなたは1行を読み、それからテストを続けます。変更することができないループではnullです。これを書くために

適切な方法は次のとおりです。

while ((message = reader.readLine()) != null){ 
    System.out.println("Server: Sending message: " + message); 
    sendToAll(message); 
} 
+0

私は、最初の行が少なくとも通り抜けるかどうかを確認するためにこの方法で設定されていることを知っています。前に、私はあなたが投稿した方法を持っていましたが、メッセージにreadLine()の結果を代入する際に問題があると考えました。私はそれが愚かに聞こえることを知っているが、私はすべてを試していた:) –

+0

Programmigは、すべてを試して構成されていません、他に何もしません。あなたは分析的でなければなりません。 – EJP

関連する問題