2011-02-10 91 views
0

我正在用Java创建一个标准的多客户端/服务器程序。服务器接受连接并产生一个新的线程来处理每个连接。客户端还产生一个线程来等待来自服务器的消息。客户端和服务器通过传递Message对象通过ObjectInputStream和ObjectOutputStreams进行通信。Java客户端/服务器通过套接字发送对象问题

初始握手工作正常。当客户端启动时,它会打开一个到服务器的套接字连接。服务器接受套接字,向客户端发送连接成功的消息。然后客户端发回它的用户名,并且客户端和服务器都开始等待消息。

然后我发送一些文本从我的客户端创建一个聊天消息,并成功发送到服务器。服务器收到此消息,并尝试将其发送给所有已连接的客户端,它会执行此操作(只有一个)。问题是这个消息永远不会回到客户端。

// This is Message.send 
public void send(ObjectOutputStream stream) throws IOException{ 
     stream.writeObject(this); 
} 

// ClientThread.run 
public void run(){ 
    try { 
     out = client.getOutputStream(); 
     out.flush(); 
     ObjectInputStream in = client.getInputStream(); 

     Message msg = null; 
     int len; 
     byte[] bytes = null; 
     int i = 0; 

     // Continuously read new Messages from the server 
     while(true){ 
      msg = (Message)in.readObject(); 

      processInput(msg); 
     } 
    } catch (Exception e) { 
     Util.showError(e.getMessage(), "Connection Error"); 
    } 

    System.out.println("Client exited"); 
} 

// ServerThread.run 
public void run() { 
    try { 
     out = new ObjectOutputStream(client.getOutputStream()); 

     ObjectInputStream in = new ObjectInputStream(client.getInputStream()); 

     Message msg = null; 

     while(client.isConnected()){ 
      msg = (Message)in.readObject(); 
      processInput(msg); 
     } 

     in.close(); 
     client.close(); 
    } catch (Exception e) { 
     server.addMessage(e.getMessage()); 
    } 
} 
+0

恩,请考虑使用SOAP或REST,而不是通过这个slogging? – bmargulies 2011-02-10 23:12:27

+0

这是一个练习,所以我可以在不使用现有协议的情况下使用较低级别的套接字进行练习。 – Jared 2011-02-11 16:10:59

回答

0

我看不到任何flush()电话,没有这些数据可能永远不会让它从A点到B点。

我建议在ByteArrayOutputStream上使用ObjectOutputStream,然后在导线上推送生成的字节数组,然后在另一端反转进程。

相关问题