【问题标题】:Waiting forever in ObjectInputStream Constructor [duplicate]在 ObjectInputStream 构造函数中永远等待[重复]
【发布时间】:2017-08-14 23:46:15
【问题描述】:

我正在创建一个客户端-服务器,如下所示:

服务器:

监听线程守护进程(总是监听传入的连接)

通过连接的客户端发送/接收数据的服务对象

客户:

可以有多个客户端实例

但是,在建立连接后的任何一方,都需要永远创建 ObjectOutputStream 和 ObjectInputStream 类型的构造函数。谷歌搜索发现thisthis。我遵循以下步骤: 1.先创建ObjectOutputStream 2.冲洗它 3. 第二次创建ObjectInputStream

但这对我不起作用。想知道为什么??

服务器:

监听线程/守护进程:

Socket connSocket;
try {
        ServiceListener.serverSocket = new ServerSocket(listenPort);
        System.out.println("Listening on port: " + listenPort);

        while (true) {
            connSocket = serverSocket.accept();
            nodeList.add(connSocket);
            System.out.println("Accepted connections ( " + connSocket + "):" + getConnectedNodeCount());
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

服务器线程(接受连接后)

for (int i=0; i<listenerObj.getConnectedNodeCount(); i++) {
        try {
            System.out.println(listenerObj.nodeList.get(i));
            serviceTx = new ObjectOutputStream(listenerObj.nodeList.get(i).getOutputStream());
            serviceTx.flush();
            serviceRx = new ObjectInputStream(listenerObj.nodeList.get(i).getInputStream());

            String rxMsg = (String) serviceRx.readObject();
            if (rxMsg.equals("HELLO")) {
                System.out.println("Service received: " + rxMsg);
                serviceTx.writeObject((Object) "HELLO");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

客户:

    try {
        System.out.println("Creating Node socket...");
        clientSocket = new Socket(getServerIp(), getServerPort());

        nodeTx = new ObjectOutputStream(clientSocket.getOutputStream());
        nodeTx.flush();
        nodeRx = new ObjectInputStream(clientSocket.getInputStream());

        System.out.println("Connected to " + getServerIp() + ":" + getServerPort());

        do {
            String outBoundMsg = new String();
            outBoundMsg = "HELLO";
            System.out.println("Node sending \"" + outBoundMsg + "\" to service");
            nodeTx.writeObject(outBoundMsg);
            nodeTx.flush();

            String rcvdMsg = (String) nodeRx.readObject();
            if(rcvdMsg.equals("HELLO")) {
                System.out.println("++++ client says " + rcvdMsg + " ++++");
            }
        } while(false);

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

服务器控制台输出:

starting Listener 11...
Service Function started !!
Listening on port: 2244
Accepted connections ( Socket[addr=/127.0.0.1,port=62994,localport=2244]):1

客户端控制台:

Creating Node socket...

【问题讨论】:

  • 你使用的是线程安全的 List 实现吗?

标签: java sockets objectinputstream objectoutputstream


【解决方案1】:

我会将 do { } while(false) 更改为 do { } while(true) 否则没有意义的 while 循环只运行一次并退出,即 do-while(false) 循环起作用就好像它不存在一样。

【讨论】:

  • 已编辑问题以反映有两个并行线程 1. 侦听器(使用 while(true) 2. 服务器线程(读取/写入)在接受的连接套接字上
  • 是的,我可以而且我应该这样做。但是,这仍然不能解决我在创建 ObjectInputStream 对象时面临的问题。
  • 如果你调试它到底挂在哪里,在哪一行,最好检查客户端上的服务器ip和端口
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2013-11-24
  • 2012-02-24
相关资源
最近更新 更多