我正在使用socket创建一个群聊项目,但是无法将我的Message对象写入socket objectOutputStream。服务器端objectInputStream什么都没找到(avalible = 0)。我试着冲洗但它不起作用。请帮帮我。
enum MessageStatus implements Serializable {Mess, Offline};
public class Message implements Serializable{
String mess;
String senderName;
int senderID;
MessageStatus type;
public Message(String mess, int SenderID, String SenderName) {
this.mess = mess;
this.senderID = SenderID;
this.senderName = SenderName;
}
我试着这样写:
Message msg = new Message(txtChat.getText().trim(), user.id, user.name);
msg.type = MessageStatus.Mess;
try {
user.Output.writeObject(msg);
user.Output.flush();
我的套接字没问题,我试图写一些字符串或int,但它可以工作,但不是我的对象。 我试图将它作为服务器端套接字对象输入流中的消息或对象,但它抛出.ClassNotFoundException 我认为我的对象没有被写入socket
答案 0 :(得分:1)
不要依赖available()
知道是否有东西要加载它确实只返回可以无阻塞地读取的字节数。
如果我这样做,请使用您的代码:
Message msg = new Message("Hello", 123, "world");
System.out.printf("Before serialization = %s%n", msg);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
oos.writeObject(msg);
oos.flush();
oos.close();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
System.out.printf("available = %d%n", ois.available());
Message message = (Message) ois.readObject();
System.out.printf("After deserialization = %s%n", message);
ois.close();
输出结果为:
Before serialization = Message{mess='Hello', senderName='world', senderID=123, type=Mess}
available = 0
After deserialization = Message{mess='Hello', senderName='world', senderID=123, type=Mess}
我可以看到邮件已正确序列化和反序列化,但仍然available
返回0
,这证明了您必须不相信available
这样的需求。