Java Socket - 反向通信

时间:2015-04-03 18:51:16

标签: java sockets

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

我通常看到逆向方法,服务器接受()并且客户端连接到它。我已经编写了这段代码,但客户端(确实接受())在 3 点被阻止,而服务器(创建与客户端的连接)在 2 上被阻止

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

客户端(接受()并等待新消息)

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();
        }

2 个答案:

答案 0 :(得分:1)

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

PrintWriter writer;

使用

ObjectOutputStream writer;

然后使用

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

答案 1 :(得分:-1)

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