2015-04-03 59 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