【问题标题】:Simple Java echo server issue简单的 Java 回显服务器问题
【发布时间】:2012-06-15 23:36:09
【问题描述】:

我正在尝试编写我的第一个套接字服务器,所以我决定先从一些非常简单的东西开始,只是为了弄清楚流程:) 我正在编写一个简单的 java echo 服务器,但问题是(对于某些原因?!)我没有在客户端收到服务器响应,尽管请求是在服务器中收到的。

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 基本套接字教程/等,但我不知道出了什么问题 - 我已成功写入服务器套接字,但我似乎无法获得响应。

【问题讨论】:

  • 您不应忽略异常。这就像戴着眼罩开车。
  • 我在您的服务器代码中没有看到您获取客户端 IP 地址的任何地方。
  • @HovercraftFullOfEels 正如包名所暗示的,这是 PoC 而不是真正的代码。不过,感谢您的建议。
  • @ChadM 我需要这个地址做什么?
  • 我相信你需要它以便知道在哪里返回响应。

标签: java sockets client echo


【解决方案1】:

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

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 错误。

【讨论】:

    【解决方案2】:

    试试这个:

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

    另外请注意,不需要writer.flush();,因为当您将true 传递给PrintWriter 构造函数的第二个参数时,它会自动刷新。

    【讨论】:

    • same :/ 感谢您的刷新说明,只是想确定这不是因为没有刷新流。我能够写入服务器套接字(如果我在服务器中记录 reader.readLine() 这将给出正确的结果,因此正确创建了套接字。我无法获得响应 - 客户端在发送后终止请求。
    • @asenovm 它是否从System.out.println(reader.readLine()); 中的readLine() 方法返回,即它是否在控制台上打印任何内容?
    猜你喜欢
    • 2011-03-17
    • 2013-06-15
    • 2013-01-08
    • 2020-05-15
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多