【问题标题】:Java Socket - Inverse CommunicationJava Socket - 反向通信
【发布时间】:2015-04-04 03:35:59
【问题描述】:

我有许多客户端正在等待服务器消息。所以客户端 make accept() 并等待服务器。当服务器有消息时,打开与客户端的连接并发送消息,然后关闭通信并重新启动循环。

我经常看到相反的方法,服务器执行 accept() 并且客户端连接到它。我已经编写了这段代码,但是客户端(执行 accept() )在点 3 被阻止,服务器(创建与客户端的连接)在点 2 被阻止强>。

当然我的代码有一些问题(不知道在哪里),但是......这是正确的方法吗?

客户端(执行 accept() 并等待新消息)

try {
                System.out.println("Waiting..");
                receiver = serverSocket.accept();

                System.out.println("1");
                ObjectInput fromServerReader = new ObjectInputStream(receiver.getInputStream());
                ObjectOutputStream toServerWriter = new ObjectOutputStream(receiver.getOutputStream());
                System.out.println("2");
                toServerWriter.writeObject("dummy");
                toServerWriter.flush();
                System.out.println("3");

                ScheduledEvent scheduledEvent = (ScheduledEvent) fromServerReader.readObject();

                System.out.println("4");

                receiver.close();
                System.out.println("5");

            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // Should never happen
            }

服务器(当有新消息要发送给客户端时,创建 连接)

try {
            InetAddress address = InetAddress.getByName(sendToUser
                    .getMachineName());
            socket = new Socket(address, port);

            log.debug("1");
            ObjectOutputStream toClientWriter = new ObjectOutputStream(
                    socket.getOutputStream());
            ObjectInputStream fromClientReader = new ObjectInputStream(socket.getInputStream());
            log.debug("2");

            String read = (String)fromClientReader.readObject();
            log.debug("3");

            // Compose the message
            ScheduledEvent scheduledEvent = new ScheduledEvent();
            scheduledEvent.setSubject(event.getSubject());
            scheduledEvent.setMessage(event.getText());

            log.debug("4");
            toClientWriter.writeObject(scheduledEvent);
            toClientWriter.flush();
            log.debug("5");

            socket.close();
            log.debug("6");
        } catch (UnknownHostException e) {
            // TODO handle
            e.printStackTrace();
        } catch (IOException | ClassNotFoundException e) {
            // TODO handle
            e.printStackTrace();
        }

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    在客户端代码中,而不是使用

    PrintWriter writer;
    

    使用

    ObjectOutputStream writer;
    

    然后使用

    writer.writeObject("dummy");
    writer.flush();
    

    【讨论】:

    • 看我的更新,我刚刚放置了一个“Waiting..”并将流更改为 Object。奇怪的是服务器(应该发送真实对象)写入 1-2-3-4-5-6 (完成所有循环)。客户端写:Waiting - 1 - 2 - 3 waiting... 输出 4 完全跳转(我在其中读取 ScheduledEvent)并返回 Waiting...
    • 等我明白了...我得到了一个没有被困住的该死的 ClassNotFoundException!
    • 该异常的堆栈跟踪是什么?
    • 我在我的服务器项目中创建了 ScheduledEvent 类,并在客户端项目中复制了该类(它们位于不同的名称包中)。出于某种原因,客户端试图在错误的包中找到该类。当然,所有编译都很好,否则我将没有机会看到堆栈跟踪
    【解决方案2】:

    尝试使用println 而不是write toServerWriter.println("dummy");。服务器可能正在等待换行符。

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 2015-05-24
      • 2014-11-05
      • 1970-01-01
      • 2019-09-24
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多