java ObjectStream 对象传输问题

塞纳河畔左岸的咖啡 2013-10-22 10:14:48
传输过程中使用的Message对象:

public class Message implements java.io.Serializable{
private String Username;
private String cmd;
private String MSG;
Message(String Username,String cmd,String MSG){
this.setUsername(Username);
this.setCmd(cmd);
this.setMSG(MSG);
}
public void setMSG(String mSG) {
MSG = mSG;
}
public String getMSG() {
return MSG;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getCmd() {
return cmd;
}
public void setUsername(String username) {
Username = username;
}
public String getUsername() {
return Username;
}
}

Server 类

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class s{
public static void main(String[] args){
try {
ServerSocket s=new ServerSocket(9528);
Socket c=s.accept();
ObjectOutputStream Tc=new ObjectOutputStream(c.getOutputStream());
Message m=new Message("","","aaaaaa");
Tc.writeObject(m);
Tc.flush();
m.setMSG("bbbbbb");
Tc.writeObject(m);
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

传输过程中的Client类:

public class c{
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException{
Socket c=new Socket("127.0.0.1",9528);
ObjectInputStream Fs=new ObjectInputStream(c.getInputStream());
Message m=(Message)Fs.readObject();

System.out.println(m.getMSG());

m=(Message)Fs.readObject();

System.out.println(m.getMSG());
}
}


预期输出结果:
aaaaaa
bbbbbb
实际测试结果:



这不是坑爹吗,那位大神帮小弟解决下
...全文
450 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
solomon5926 2013-10-22
  • 打赏
  • 举报
回复
楼主可以用生产者-消费者来解决这个问题,当服务端内容不变的时候,客户端就不进行下一步打印,只有服务端信息发生变化,再通知客户端打印,当客户端完成打印的时候,再通知服务端可以进行信息更新了。
Defonds 2013-10-22
  • 打赏
  • 举报
回复
楼主客气了。这些东西没有啥具体成熟套路,就是用的熟了就知道的多一点,多看看 API,万变不离其宗。
  • 打赏
  • 举报
回复
引用 3 楼 defonds 的回复:
如果你不想重新搞一个对象的话,复位一下 ObjectOutputStream 也可以:

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class s{
	public static void main(String[] args){
		try {
			ServerSocket s=new ServerSocket(9528);
			Socket c=s.accept();
			ObjectOutputStream Tc=new ObjectOutputStream(c.getOutputStream());
			Message m=new Message("","","aaaaaa");
			Tc.writeObject(m);
		    Tc.flush();
		    Tc.reset();
			m.setMSG("bbbbbb");
			Tc.writeObject(m);
			System.in.read();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
谢大神,大神有没有关于ObjectStream对象使用的详细法则,比如像这样的一样的错误
  • 打赏
  • 举报
回复
没有别的方法了吗,每次要发消息就要这样新建一个对象?通信多了名字都缓换不过来
Defonds 2013-10-22
  • 打赏
  • 举报
回复
如果你不想重新搞一个对象的话,复位一下 ObjectOutputStream 也可以:

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class s{
	public static void main(String[] args){
		try {
			ServerSocket s=new ServerSocket(9528);
			Socket c=s.accept();
			ObjectOutputStream Tc=new ObjectOutputStream(c.getOutputStream());
			Message m=new Message("","","aaaaaa");
			Tc.writeObject(m);
		    Tc.flush();
		    Tc.reset();
			m.setMSG("bbbbbb");
			Tc.writeObject(m);
			System.in.read();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
zhuweisyyc 2013-10-22
  • 打赏
  • 举报
回复
第二个wtiteObject没有flush。
Defonds 2013-10-22
  • 打赏
  • 举报
回复
序列化机制只关心对象是否变化,而不关心内容是否变化。你这样写:

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class s{
	public static void main(String[] args){
		try {
			ServerSocket s=new ServerSocket(9528);
			Socket c=s.accept();
			ObjectOutputStream Tc=new ObjectOutputStream(c.getOutputStream());
			Message m=new Message("","","aaaaaa");
			Tc.writeObject(m);
		    Tc.flush();
		    Message m2=new Message("","","bbbbbb");
			//m.setMSG("bbbbbb");
			Tc.writeObject(m2);
			System.in.read();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧