【问题标题】:Java client/server issue sending objects over sockets [duplicate]Java客户端/服务器问题通过套接字发送对象[重复]
【发布时间】:2011-02-12 06:32:51
【问题描述】:

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

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

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

// 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());
    }
}

【问题讨论】:

  • 嗯,考虑使用 SOAP 或 REST 而不是一劳永逸?
  • 这是一个练习,所以我可以在不使用现有协议的情况下练习较低级别的套接字。

标签: java multithreading sockets


【解决方案1】:

我没有看到任何对 flush() 的调用,否则数据可能永远无法从 a 点传输到 b 点。

我建议在 ByteArrayOutputStream 上使用 ObjectOutputStream,然后将生成的字节数组推过网络,然后在另一端反转该过程。

【讨论】:

  • 我在 send() 中的 writeObject 调用之后添加了一个 flush(),并在实例化每个 ObjectOutputStreams 之后添加了一个。不过运气不好。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2019-06-03
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多