Java Sockets - 尝试实现多线程时出现 EOFException

标签 java multithreading sockets client-server eofexception

我认为这是因为当我对客户端和服务器进行多线程处理时,我使用的 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 并允许自己执行多线程客户端-服务器套接字交互?

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

最佳答案

问题是您在 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();
        }
    }
}

关于Java Sockets - 尝试实现多线程时出现 EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276974/

相关文章:

c - 当非阻塞流套接字连接时调用 getsockname() 是否安全?

java - 如果不使用,蓝牙套接字上的输入流读取将挂起

java - 将 null 转换为任何类型

java - 两个线程怎么会同时进入synchronized block 呢?

java - 如何将 kafkacat 与消息中心一起使用

C++疑似堆栈溢出改变函数参数

wpf - 如何从Task更新CollectionViewSource的Source属性?

c - C中udp套接字上的poll()POLLIN事件

java - 如何同时运行多个线程进行自动化 Selenium 测试?

使用maven的Java NoClassDefFoundError