2017-03-06 125 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(); 
     } 
    } 

连接管理器对象是ChatGUI的一部分。 ChatGUI的字段写入器和读取器获得和从CM,以便与ChatGUI的JTextField中(msgInput)一起传递作家设置为SendButtonListener:

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; 
} 

最后,一个新的线程开始监听来自客户端的任何新的消息:

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

那就是:

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(); 
     } 
    } 
} 

的周期到达“线程:等待消息发送...”,但没有更进一步,reader.readLine()返回null(用sysout检查:))。我试图去调试它,但是我没有那么有经验,尤其是调试两个单独的代码。我一直在看这个为期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); 
    } 
} 

这是没有意义的。你读一行,然后继续测试。它在无法更改的循环中为null。

写这方面的一个正确的方法是:

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

我知道,它是以这种方式设置的,只是为了检查最初的线路是否至少能够通过。之前,我已经按照您发布的方式进行了操作,但认为问题可能在于将readLine()结果分配给消息。我知道这听起来很愚蠢,但我正在尝试一切:) –

+0

Programmig不包括尝试一切,也没有其他任何东西。你必须分析。 – EJP

相关问题