我做了一个信使,通过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);
}
如果您有任何改进技巧,请告诉我,我会更新此代码。
您可以创建父类Message
,子类DataMessage
和TextMessage
。
接收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
}
我希望能够检索/发送可序列化的文件,同时还能够检索/发送来自用户的消息。
你可以用一个 ObjectInputStream
和 ObjectOutputStream
.
我找不到一种好方法在两者(对象和消息)之间进行排序而不会引起与消息传递的冲突。
在您指定"冲突"之前,该声明毫无意义。
我尝试为同一个套接字使用两个流(Data*Stream & Object*Stream)
-
你不能这么做。在套接字的生命周期内使用相同的流。
-
你不需要这样做。你可以用
Data*Stream
做任何事情,你可以用Object*Stream,
做,因为Data*Stream
实现Data*Put
,Object*Stream
实现Object*Put
,Object*Put
扩展Data*Put
。
它似乎建立得很好,但是当我尝试通过 Data*Stream 从服务器向客户端发送消息时,我得到 java.net.SocketException:套接字在我的客户端上关闭。
这意味着您关闭了流并继续使用它。这是由于您使用了两个流引起的。关闭环绕套接字输入或输出流的任何流将关闭另一个流和套接字。你不需要这个。
(仅在我发送消息时发生)
仅当您读取或写入已关闭的流时,才会发生这种情况。
有人可以指出我如何通过流检索 2 种不同类型的信息的正确方向吗?
只需使用Object*Stream
的 API 即可。
(没有采取简单的方法。我不想做 writeObject("[message]"+input);或任何像这样的廉价技巧。
我不知道你为什么认为这是一个"廉价的把戏"。你需要停止做假设并开始设计。