【问题标题】:Java Sockets - EOFException when trying to implement multi-threadingJava Sockets - 尝试实现多线程时出现 EOFException
【发布时间】:2015-10-22 08:52:25
【问题描述】:

我认为这是因为当我对客户端和服务器进行多线程处理时,我使用的 DataOutputStreamDataInputStream 缓冲区会被覆盖或类似情况,因为套接字只能有 1 个双工连接。

这是我现在拥有的:

我的客户端程序中的客户端类:

public static void main(String args[]) throws UnknownHostException, IOException, InterruptedException {
        for (int i=0;i<2;i++) //change limit on i to change number of threads
        {
            new Thread(new ClientHandler(i)).start();
        }
        Thread.sleep(10000);

我的客户端程序中的ClientHandler类: (向服务器发送一个值,服务器会回显它)。

public class ClientHandler implements Runnable {
public int clientNumber;
public ClientHandler(int i){
    this.clientNumber=i;
}
public void run() {
        Socket socket = null;
        try {
            socket = new Socket("localhost",9990);
            System.out.println("connected client number "+clientNumber);
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            DataInputStream input = new   DataInputStream(socket.getInputStream());
            output.writeDouble((new Random()).nextDouble());
            System.out.println(input.readDouble());
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

我的服务器程序中的服务器类:

    ServerSocket socket = new ServerSocket(9990);
    try { 
        while (true) {
            Socket threadSocket = socket.accept();
            new Thread(new ServerHandler(threadSocket)).start();
            Thread.sleep(10000);
}
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    finally {
        socket.close();
        }
    }
}

我的服务器程序中的ServerHandler类(从客户端接收值并将其回显)

public class ServerHandler implements Runnable {
    private Socket socket;
    public ServerHandler(Socket socket) {
    this.socket = socket;
}

public void run() {
    while(true) {
      try {
            DataInputStream input = new DataInputStream(socket.getInputStream());
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    double a = input.readDouble();
            output.writeDouble(a);

}catch (IOException e){
      e.printStackTrace();

  }
}

}

所以这是一个非常简单的实现:创建客户端的多个线程,并将它们连接到服务器的多个线程。

一切正常,直到该行:

double a = input.readDouble();

在我的 ServerHandler 类中。

我收到了EOFException

我猜这是因为套接字之间只能有一个双工连接。但如果是这样的话,那么我将如何实现套接字的多线程呢?

所以我的问题是:如何摆脱 EOFException 并允许自己执行多线程客户端-服务器套接字交互?

(最好不要对我的代码进行太多更改,因为我花了很长时间才达到这一点)。

【问题讨论】:

  • 为什么需要Thread.sleep(10000);?另外,你能发布堆栈跟踪吗?
  • 我在一个例子中看到过 Thread.sleep(10000) 并且只是使用它 - 不完全确定它在做什么。如何发布堆栈跟踪?
  • e.printStackTrace();在控制台中打印它。只需将其复制粘贴到问题中即可。
  • 我实际上只是在我的 ServerHandler 类中删除了我的 while(true) 循环,并且随机不再出现错误......它实际上可能正在工作!会更新!

标签: java multithreading sockets client-server eofexception


【解决方案1】:

问题是您在 ServerHandler 中为所有线程共享相同的 Socket 变量:

private static Socket socket

删除静态关键字。您的 ServerHandler 将是这样的:

public static class ServerHandler implements Runnable {
    private Socket socket;

    public ServerHandler(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            DataInputStream input = new DataInputStream(socket.getInputStream());
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            double a = input.readDouble();
            output.writeDouble(a);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

  • 您好,感谢您的回答!我删除了 static 关键字,但当我尝试运行代码时仍然收到 EOFExeption。
  • @user83676 你能用你的修复更新有问题的代码吗?
  • @user83676 hm 你的 ServerHandler 代码看起来很奇怪,因为 run() 方法中没有异常处理......在我的 ServerHandler 版本中,我添加了 IOException 处理。
  • 我实际上只是忘了把它放在我原来的问题中 - 我也会在这里更新它。
  • 啊哈!感谢您提出这个问题,因为它让我在 while(true){} 循环中编写,导致一切都无法正常工作......代码现在完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多