简体   繁体   English

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

[英]java - server not recieving messages from client (reader.readLine() == null ?)

so i've been making a simple chat, than has a server and a bunch of clients connected to them. 因此,我一直在进行简单的聊天,而不是拥有一台服务器和一堆客户端。 On the client side i have class ConnectionManager to manage creating socket and such. 在客户端,我有类ConnectionManager来管理套接字的创建等。 Here is it's core method: 这是它的核心方法:

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 object is a part of ChatGUI. 连接管理器对象是ChatGUI的一部分。 ChatGUI's fields writer and reader are obtained and set from CM in order to pass writer along with ChatGUI's JTextField (msgInput) to SendButtonListener: 从CM获取并设置ChatGUI的字段writer和reader,以便将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);
}

Then, actionPerformed method does: 然后,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("");
}

} }

On the server side on the other hand i've got this: 另一方面,在服务器端,我得到了:

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

And after the above comes this: 在上述情况之后:

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

And finally, a new thread starts to listen to any new messages from that client: 最后,一个新线程开始侦听来自该客户端的任何新消息:

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

Which is: 这是:

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

The cycle gets to the "Thread: waiting for messages to send...", but not any further, reader.readLine() returns null (checked with a sysout :) ). 循环进入“线程:正在等待消息发送...”,但除此之外,reader.readLine()返回null(已通过sysout检查)。 I was trying to debug it, but i'm not so experienced in programing so much, especially debugging two separate codes working with each other. 我试图调试它,但是我在编程方面没有太多经验,尤其是调试两个相互独立的代码。 I've been looking at this for 3 days, and i'm seriously stuck here. 我已经看了三天了,我被严重卡在这里。

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

This makes no sense. 这是没有道理的。 You read one line and then keep testing. 您读了一行,然后继续测试。 It for null in a loop in which it can never change. 在永远不变的循环中,它为null。

A proper way to write this is: 编写此代码的正确方法是:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Java 在 reader.readLine() 从服务器读取数据时出现套接字错误 - Java socket error while reading data from server at reader.readLine() 客户端未从服务器接收消息,而是在Java中接收到null - Client not recieving message from server instead recieving null in java 使用ProcessBuilder执行Linux命令并从reader.readLine()获取NULL,尽管行数为102 - Using ProcessBuilder to execute Linux Command and getting NULL from reader.readLine() although line count is 102 bufferedReader reader.readline 直接回null - bufferedReader reader.readline directly goes back to null 使用“ while(line = reader.readLine()!= null)”时,类型不匹配 - Type mismatch when using “while(line = reader.readLine() != null)” Java reader.readLine()不会在文件中返回确切的行 - Java reader.readLine() dosn't return the exact line in the file 如何从reader.readLine()返回的String中删除unicode空格 - how to remove unicode spaces from String returned by reader.readLine() Java-客户端从服务器接收空白消息,但仅通过网络 - Java - Client recieving blank messages from Server, but only over network Java服务器未从客户端接收数据 - Java server is not recieving data from client 如何在reader.readLine()期间检测第一行和最后一行? - How to detect first and last line during reader.readLine()?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM