为什么我的客户端和服务器不互相发送消息?

问题描述 投票:0回答:1

在我的网络课程中,我的任务是将 OneWayMesg(客户端向服务器发送消息)程序转换为 TwoWayMesg(客户端向服务器发送消息,服务器向客户端发送消息)。

理论上,这应该不比仅仅调整 C2S 代码更困难,包括从 ClientReader 到 ServerReader 以及从 Client 打印行到 Server 打印行。我这样做了,虽然我的代码没有抛出任何错误,但在控制台中我无法使客户端和服务器相互通信。

我的代码哪里搞砸了?

// Client.java
            BufferedReader fromUserReader = new BufferedReader(
                    new InputStreamReader(System.in));


                    // Prepare to read from server
            BufferedReader fromServerReader = new BufferedReader(
                new InputStreamReader(sock.getInputStream()));

            // Keep doing till we get EOF from user
            while (true) {
                // Read a line from the keyboard
                String line = fromUserReader.readLine();

                // If we get null, it means user is done
                if (line == null) {
                    System.out.println("Closing connection");
                    break;
                }

                // Send the line to the server
                toServerWriter.println(line);

                // Read a message from the client
                String message = fromServerReader.readLine();

                // Display the message
                System.out.println("Server: " + message);
            }
//Server.java
try {
            // Create a server socket with the given port
            ServerSocket serverSock = new ServerSocket(serverPort);
            System.out.println("Waiting for a client ...");

            // Wait to receive a connection request
            Socket clientSock = serverSock.accept();
            System.out.println("Connected to a client at ('" +
                                                ((InetSocketAddress) clientSock.getRemoteSocketAddress()).getAddress().getHostAddress()
                                                + "', '" +
                                                ((InetSocketAddress) clientSock.getRemoteSocketAddress()).getPort()
                                                + "')"
                                                );

            // No other clients, close the server socket
            serverSock.close();

            // Prepare to read from client
            BufferedReader fromClientReader = new BufferedReader(
                    new InputStreamReader(clientSock.getInputStream()));

            // Keep serving the client
            while (true) {
                // Read a message from the client
                String message = fromClientReader.readLine();

                // Read a line from the keyboard
                String line = fromClientReader.readLine();

                // If we get null, it means client sent EOF
                if (message == null) {
                    System.out.println("Client closed connection");
                    clientSock.close();
                    break;
                }

                // Display the message
                System.out.println("Client: " + message);
            }

The Client console The Server console

谢谢

java sockets client serversocket bufferedwriter
1个回答
0
投票

使用客户端阅读器时注释“从键盘读取”不会使其从键盘读取。编写客户端代码来期望来自服务器的数据不会导致服务器发送数据。

您显然想要的是一个发送线路然后等待接收线路的客户端;以及等待接收行然后发送行的匹配服务器。但你的代码并没有这样做。

我诊断出没有阅读你实际写的内容的情况。这就是 90% 的调试代码:查看那里有什么,而不是你想要在那里的东西。

此外,打印出“关闭连接”并不会关闭连接。也许客户端代码随后立即退出,这将为您完成这项工作;但我们没有该代码。

© www.soinside.com 2019 - 2024. All rights reserved.