对通过ObjectInputStream接收的数据进行排序

时间:2013-10-20 09:01:05

标签: java sockets stream objectinputstream objectoutputstream

我做了一个通过ObjectInputStream从服务器接收数据的信使。 我希望能够检索/发送可序列化文件,同时还能够从用户检索/发送消息。

我找不到在两者之间进行排序的好方法(对象和消息),而不会导致与消息传递冲突。

我已经尝试将两个流用于同一个套接字(Data * Stream& Object * Stream),它似乎建立良好,但是当我尝试通过Data * Stream从服务器向客户端发送消息时,我在我的客户端获得java.net.SocketException: socket closed。 (仅在我发送消息时才发生)

有人能指出我如何通过流检索2种不同类型的信息吗? (没有采取简单的方法。我不想做writeObject("[message]"+input);或任何类似的廉价技巧。



(编辑)解决方案:

感谢janos,他激励我编写这段代码。 :')谢谢你

输入接收器:

protected Object data;

public synchronized Object receivedData() throws ClassNotFoundException,
                                                 IOException {
    data = in.readObject();

    if(!(data instanceof String)) {
        retrieveObject();
        data = "";
        System.out.println("Object");
    }
    return data;
}

和消息传递线程:

ExecutorService pool = Executors.newScheduledThreadPool(1);

private Runnable receiveData;
public void receiveData() {
    receiveData = new Runnable() {

        public void run() {
            String input;
            try {
                while((input = (String) receivedData()) != null) {
                    if(input.length() > 1) 
                        System.out.println(input);

                }
            }catch(IOException | ClassNotFoundException e){ e.printStackTrace();}
        }
    };

    pool.execute(receiveData);
}

如果您有任何改进提示,请告诉我,我会更新此代码。

2 个答案:

答案 0 :(得分:1)

您可以创建父类Message和子类DataMessageTextMessage

收到Message后,您可以检查instanceof其基础类型,并相应处理。

这些*Message类可以在成员变量中包装您希望在客户端和服务器之间传递的任何对象。 *Message类必须是可序列化的,因此所有成员变量也必须是可序列化的。

例如,给定这些Message类型:

class Message {}

class TextMessage extends Message {
    String text;
}

class DataMessage extends Message {
    User user;
}

您可以处理收到的消息,例如:

Message message = (Message) in.readObject();
if (message instanceof TextMessage) {
    // do something with ((TextMessage)message).text
} else if (message instanceof DataMessage) {
    // do something with ((DataMessage)message).user
}

答案 1 :(得分:1)

  

我希望能够检索/发送可序列化文件,同时还能够从用户检索/发送消息。

您可以使用ObjectInputStreamObjectOutputStream完成所有操作。

  

我找不到在两者之间进行排序的好方法(对象和消息),而不会导致与消息传递冲突。

在您指定“冲突”之前,该陈述毫无意义。

  

我尝试将两个流用于同一个套接字(Data * Stream& Object * Stream)

  1. 你做不到。在套接字的生命周期中使用相同的流。

  2. 您不需要这样做。您可以使用Data*Stream执行Object*Stream,所做的任何事情,因为Data*Stream实施Data*PutObject*Stream实施Object*Put,{{1} }} extends Object*Put

  3.   

    似乎建立得很好,但是当我尝试通过Data * Stream从服务器向客户端发送消息时,我得到了java.net.SocketException:在我的客户端关闭了套接字。

    这意味着关闭了流并继续使用它。这是由于您使用了两个流。关闭缠绕在套接字输入或输出流上的任何流会关闭另一个流和套接字。你不需要这个。

      

    (仅在我发送消息时才会发生)

    只有在您读取或写入已关闭的流时才会发生这种情况。

      

    有人能指出我如何通过流检索2种不同类型的信息吗?

    只需使用Data*Put的API。

      

    (没有简单的方法。我不想做writeObject(“[message]”+输入);或任何类似的廉价技巧。

    我不知道为什么你认为这是一个'廉价技巧'。你需要停止做出假设并开始设计。