套接字程序发送和接收用户定义的对象不起作用

我有一个用户定义的类Message,我想在客户端和服务器之间传递它的对象。

Message类如下:

import java.io.Serializable; public class Message implements Serializable { String CorS; int data_id; int status_id; Integer value; boolean withdraw; public Message() { CorS = null; data_id = 0; status_id = 0; value = 0; withdraw = false; } public Message(String CorS, int data_id, int status_id, Integer value) { this.CorS = CorS; this.data_id = data_id; this.status_id = status_id; this.value = value; } public Message(boolean withdraw) { this.withdraw = withdraw; } } 

将对象发送到服务器的客户端代码如下:

 Socket s = null; ObjectInputStream in = null; ObjectOutputStream out = null; String hostname = null; int port_no = 0; HashMap map = null; Message m = null; map = servers.get("Server" + server); for(String key : map.keySet()) { hostname = key; port_no = map.get(key); } //System.out.println(hostname + " " + port_no); s = new Socket(hostname, port_no); in = new ObjectInputStream(new BufferedInputStream(s.getInputStream())); out = new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream())); s_now = s; m = new Message(client, data, 0, 0); out.writeObject(m); out.flush(); System.out.println("Sent obj"); 

同样,服务器端的代码如下:

 while (true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(server.getInputStream())); //ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream()); Message m = (Message) in.readObject(); System.out.println(m.value); } catch (IOException e) { e.printStackTrace(); break; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

问题是该对象没有被打印。 我得到的输出如下:

 Waiting for client on port 1051... Just connected to /127.0.0.1:59216 

在这方面的任何帮助将不胜感激。 谢谢 :)

您需要在两端的ObjectInputStream之前创建ObjectOutputStream

原因是,如Javadoc中所述,各个构造函数编写和读取流头。 因此,在对等体的输出流构造函数执行之前,输入流构造函数不能返回。 因此,如果您首先构造两个输入流,则会出现死锁。