简单Java回显服务器问题

4

我正在尝试编写我的第一个 socket 服务器,所以我决定从非常简单的事情开始,只是为了弄清楚流程 :) 我正在编写一个简单的 Java 回显服务器,但问题是(因为某种原因?!)我在客户端没有收到服务器响应,尽管请求已经在服务器中接收到。

package poc.client;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");
            writer.flush();
            writer.close();

            System.out.println(reader.readLine());
            System.out.flush();
        } catch (Exception ex) {
                Logger.getAnonymouseLogger().throwing(TAG, "main", ex);
        }

    }
}

服务器部分是:

package poc.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    /**
     * debugging purposes only
     */
    @SuppressWarnings("unused")
    private static final String TAG = Server.class.getSimpleName();

    public static void main(String[] args) {
        try {
            final ServerSocket socket = new ServerSocket(50000);
            while (true) {
                final Socket clientSocket = socket.accept();
                final BufferedReader reader = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()));
                final PrintWriter writer = new PrintWriter(clientSocket
                        .getOutputStream(), true);

                writer.println(reader.readLine());
                writer.flush();
                writer.close();
            }
        } catch (IOException e) {
                Logger.getAnonymouseLogger().throwins(TAG, "main",ex);
        }

    }
}

我阅读了所有Oracle基础套接字教程等,但我就是无法弄清楚问题所在 - 我成功地向服务器套接字写入数据,但似乎无法获取响应。


2
你不应该忽略异常。那就像戴着眼罩开车一样危险。 - Hovercraft Full Of Eels
我在你的服务器代码中没有看到任何获取客户端 IP 地址的地方。 - Chad
@HovercraftFullOfEels 正如包名所示,这只是概念验证而不是真正的代码。感谢您的建议。 - asenovm
@ChadM:你能展示一份教程或文档来支持你的建议吗?因为我不认为你的说法是正确的。服务器所需做的就是接受连接,我们已经知道它正在这样做。 - Hovercraft Full Of Eels
@asenovm,你尝试打印异常跟踪信息了吗? - Santosh
显示剩余2条评论
2个回答

2

在从套接字读取之前不要关闭写入器。以下代码有效:

final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");

            System.out.println(reader.readLine());            
            //writer.flush();
            writer.close();

根据close()方法的javadoc:
关闭流并释放与之关联的任何系统资源。关闭先前关闭的流没有影响。
看起来如果您关闭流,底层套接字也会关闭。您可以通过在当前代码中打印堆栈跟踪来验证这一点。它会给出"java.net.SocketException: socket closed"错误。

0

试试这个:

Socket socket = new Socket(InetAddress.getLocalHost(), 50000);

还要注意的是,由于在PrintWriter构造函数的第二个参数中传递了true,使其成为自动刷新流,因此不需要使用writer.flush();

感谢提供刷新注意事项,只是想确保不是因为未刷新流而导致的问题。我能够向服务器套接字写入数据(如果在服务器端记录reader.readLine(),将会得到正确的结果,因此套接字已经正确创建),但我无法获取响应 - 客户端在发送请求后就会终止。 - asenovm
@asenovm 在 System.out.println(reader.readLine()); 方法中,它是否从 readLine() 方法返回,即是否在控制台上打印任何内容? - Eng.Fouad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接