2015-04-03 60 views
0

我有許多客戶端正在等待服務器消息。所以客戶端接受()並等待服務器。當服務器有消息時,打開與客戶端的連接併發送消息,然後關閉通信並重啓循環。Java Socket - 反向通信

我通常看到了服務器接受()和客戶端連接的反向方法。我已經編寫了這段代碼,但客戶端(接受())在點上被阻塞,並且服務器(創建到客戶端的連接)在點上被阻塞。

當然我在我的代碼中有一些問題(不知道在哪裏),但是......這是正確的方法?

客戶端(即不接受(),並等待新的消息)

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

回答

-1

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

+0

服務器試圖讀取一個對象,而不是一條線。 – EJP 2015-04-03 23:26:55

1

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

PrintWriter writer; 

使用

ObjectOutputStream writer; 

然後用

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

看看我的更新,我剛剛放置了一個「Waiting ..」並將流更改爲Object。奇怪的是,那個服務器(應該發送真正的對象)寫1-2-3-4-5-6(完成所有的循環)。客戶端寫:等待 - 1 - 2 - 3等待...輸出4被完全跳過(我讀了ScheduledEvent),然後回到Waiting ... – Mistre83 2015-04-03 19:38:12

+0

等我明白了...我有一個該死的ClassNotFoundException被困! – Mistre83 2015-04-03 19:41:35

+0

什麼是該異常的堆棧跟蹤? – ELITE 2015-04-03 19:43:48