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

Java 用于发送和接收用户定义对象的套接字程序不工作,java,sockets,object,serializable,Java,Sockets,Object,Serializable,我有一个用户定义的类消息,我想在客户端和服务器之间传递它的对象 消息类如下所示: import java.io.Serializable; public class Message implements Serializable { String CorS; int data_id; int status_id; Integer value; boolean withdraw; public Message() { Co

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

消息类如下所示:

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<String, Integer> 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
将对象发送到服务器的客户端中的代码如下:

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<String, Integer> 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
问题是对象没有打印出来。我得到的结果如下:

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<String, Integer> 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中所描述的,相应的构造函数写入和读取流头。因此,在对等方的输出流构造函数执行之前,输入流构造函数无法返回。因此,如果您先构造两个输入流,就会出现死锁。

谢谢。成功了。但是你能告诉我为什么会这样吗?有什么合理的解释吗?