java - 服务器没有从客户端收到消息(reader.readLine()== null?)

时间:2017-03-06 06:06:44

标签: java sockets connection

所以我一直在做一个简单的聊天,而不是一台服务器和一堆连接到它们的客户端。在客户端,我有类ConnectionManager来管理创建套接字等。这是它的核心方法:

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的字段writer和reader是从CM获取并设置的,以便将writer和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天了,我真的被困在这里了。

1 个答案:

答案 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);
}