【问题标题】:Java client socket writing is skipped if server is not reading如果服务器未读取,则跳过 Java 客户端套接字写入
【发布时间】:2019-04-05 12:06:18
【问题描述】:

我有一个 java 程序,其中客户端将使用套接字不断地向服务器发送一个数字。 通常,“readObject”或“writeObject”调用会等到对方准备好发送或接收。但在我这里的具体情况下,如果服务器当前没有读取,客户端将跳过对服务器的写入。

下面是我的客户端代码。我有一个请求类来发送信息,在我的情况下它只是一个整数:

    Socket socket = new Socket("localhost", 2910);
    ObjectOutputStream outToServer = new ObjectOutputStream(socket.getOutputStream());
    Random r = new Random();
    while(true) {
        Request request = new Request();
        request.reqType = Request.TYPE.ADD;
        request.add = r.nextInt(100);
        System.out.println("Sending to server: " + request.add);
        outToServer.writeObject(request);
        Thread.sleep(100);
    }

这是服务器部分:

try {
        ObjectInputStream inFromClient = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream outToClient = new ObjectOutputStream(socket.getOutputStream());

        while(true) {
            Request req = (Request)inFromClient.readObject();

            switch (req.reqType) {
                case ADD : {
                    Logger.getInstance().log(name + " added " + req.add);
                    serv.add(req.add);
                    break;
                }
                case RESULT : {
                    Logger.getInstance().log(name + " produced result " + req.result);
                    break;
                }
                case RETRIEVE : {
                    int[] retrieve = serv.retrieve();
                    Logger.getInstance().log(name + " retrieved: " + retrieve[0] + ", " + retrieve[1] + ", " + retrieve[2]);
                    outToClient.writeObject(new Request(retrieve));
                    break;
                }
            }

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

以上代码在线程中运行。 所以这里的事情是,我的客户发送一个 Request 对象,并将类型设置为 ADD。服务器将读取/接收请求,并检查类型,发现它是 ADD,所以它会调用 'serv.add'。这个调用可能会导致一个“wait()”调用,这意味着这里的线程在此时暂停,因此,卡住了。 客户端将尝试发送下一个请求对象,但由于服务器线程卡在“serv.add”调用上,客户端似乎没有写任何东西,只是跳过调用,并执行while循环再次。 所以我试图发送一堆请求,服务器没有收到。

我希望这是有道理的。

所以我想我的问题是: 如果服务器当前没有尝试从客户端读取,而客户端正在尝试写入,那么“writeObject”调用是否会超时,然后继续,或者发生了什么?

【问题讨论】:

    标签: java multithreading sockets java-threads


    【解决方案1】:

    因此以供将来参考。 writeObject 只会将一堆对象发送到服务器。 readObject 将按照自己的节奏读取它们。似乎有某种与 readObject 相关的内部缓冲区。 我的客户端发送 30 个整数,服务器读取 10,然后 wait()s。客户端终止。服务器将在某个时候继续,然后读取其余发送的对象。 所以我什么都不会丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2012-06-05
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多