簡體   English   中英

Java套接字-逆向通信

[英]Java Socket - Inverse Communication

我有許多正在等待服務器消息的客戶端。 因此,客戶端使accept()並等待服務器。 當服務器收到消息時,打開與客戶端的連接並發送消息,然后關閉通信並重新啟動周期。

我通常會看到相反的方法,即服務器執行accept()並由客戶端連接到該方法。 我已經編寫了這段代碼,但是客戶端(做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();
        }

在客戶端代碼中,而不是使用

PrintWriter writer;

采用

ObjectOutputStream writer;

然后用

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

嘗試使用println而不是write toServerWriter.println("dummy"); 服務器可能正在等待換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM