gpt4 book ai didi

java - 客户端从套接字读取对象时卡住

转载 作者:行者123 更新时间:2023-11-30 03:58:55 26 4
gpt4 key购买 nike

我正在通过套接字开发一个简单的客户端-服务器应用程序,但我不明白为什么客户端在读取对象时会卡住。服务器必须能够处理多个客户端。

简单来说,我的服务器看起来像:

    ...
server_thread = new Thread(new Runnable() {
@Override
public void run() {
int p = 0;
ObjectInputStream in;
ObjectOutputStream out;
NetworkOffer message;

try (ServerSocket serverSocket = new ServerSocket(port)) {
// get connections
LinkedList<Socket> client_sockets = new LinkedList<>();
while (p++ < partecipants) client_sockets.add(serverSocket.accept());

// sending welcome object
for (Socket socket : client_sockets) {
out = new ObjectOutputStream(socket.getOutputStream());
message = new NetworkOffer();
out.writeObject(buyer_offer);
}
...

我的客户:

    ...
client_thread = new Thread(new Runnable() {

@Override
public void run() {
ObjectInputStream in;
NetworkOffer smessage;
try {
Socket ssocket = new Socket("localhost", port);
in = new ObjectInputStream(ssocket.getInputStream());

// waiting server message
------------->Object o = in.readObject();
smessage = (NetworkOffer)o;


System.out.println(smessage.toString());
...

编辑:为了让事情更清楚,这是我想要实现的协议(protocol):

  1. N 个客户端连接到服务器
  2. 服务器向客户端发送欢迎

  3. 每个客户都提出报价

  4. 服务器选择最佳报价,并向每个客户端发送一条包含接受/拒绝的消息
  5. 如果没有可接受的报价,请转到 3。

即使服务器已经发送了他的消息,客户端也会坚持Object o = in.readObject();。没有错误,什么都没有。线程只是卡住在那里等待某些东西。

发生什么事了?

最佳答案

问题是 ServerSocket.accept() 是一个阻塞调用,这意味着服务器将挂起,直到有人连接到它。当有人连接时,服务器会将新套接字添加到 client_sockets 中。如果添加的套接字数量少于participants,则会再次调用accept()并等待另一个连接。仅当套接字总数等于参与者时,它才会进入您的for循环。您需要生成一个新线程来处理每个传入的客户端套接字,并允许服务器立即返回到 ServerSocket.accept()。看看Reactor模式是如何实现这一点的一个很好的例子。

您的代码应如下所示:

  1. 服务器等待连接。
  2. 当客户端连接时,生成一个新线程来处理连接。
  3. 服务器返回等待连接。
  4. 新线程在套接字上发送欢迎消息,将套接字添加到 client_sockets 列表中,并等待客户端提供。
  5. 存储客户报价。
  6. 收到所有报价后,进行比较以找到最好的。
  7. 发送接受/拒绝消息。

关于java - 客户端从套接字读取对象时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com