当前位置: 首页 > 面试题库 >

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

颜森
2023-03-14
问题内容

我有一个用户定义的类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<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

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


问题答案:

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

原因是,如Javadoc中所述,各自的构造函数编写和读取流头。因此,输入流构造函数必须等到对等方的输出流构造函数执行后才能返回。因此,如果首先构造两个输入流,则将出现死锁。



 类似资料:
  • 我在网上搜索了很多,但是没有找到通过套接字发送对象并按原样接收的解决方案。我知道它需要酸洗,我已经做过了。将其转换为字节,然后从另一方面接收。但如何将这些字节转换为该类型的对象。 这是在客户端将对象转换为StringIO并发送到服务器的代码。在服务器端,我得到字节。现在我正在搜索要再次转换为StringIO的字节,以便获得对象值。 在代码中,对象被包装在StringIO中,并通过套接字发送。任何更

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 问题内容: 我正在建立一个客户-服务器项目。 我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。 这是我的代码: 该类在包中定义: 我的问题是: 首先,我执行服务器,然后看到控制台中显示的内容。 然后我执行客户端,在控制台中,我收到如下消息: 同时,服务器端未显示任何新内容。 现在,我停止客户端,并显示服务器的所有其他消息: 当

  • 我在 C#.net 中使用 UDP 异步套接字,我想让服务器和客户端在不同的端口进行通信以进行发送和接收, 服务器使用端口 A 发送到客户端,从具有端口 B 的客户端接收 客户端从具有端口 A 的服务器接收数据,并将数据发送到具有端口 B 的服务器 可能吗??

  • 问题内容: 我想通过套接字通道传输序列化的对象。我想将“ Hi friends”字符串作为序列化对象,然后将此对象写入套接字通道,而在另一端,我想读取相同的对象并检索数据。 我想使用Java来做所有这些事情。这该怎么做?我已经尝试过以下操作,但是在接收方没有得到任何数据。 问题答案: 您的SocketChannel处理似乎不完整,请参阅此 完整 示例以了解SocketChannel传输字节的方法:

  • 我正试图通过Java的socket发送一个custome对象。我知道我需要将具有我需要发送的对象的类放在相同的包中,具有相同的serialVersionUID并实现Serializable。我已经这样做了,但我仍然不能通过套接字发送对象。我错在哪里了? 以下是客户端代码: 客户端中的类用户 发送user类对象的代码: 这里是服务器的代码: user类的代码:与客户端的user完全相同(我从客户端复