这个问题主要是关于Socket的流
ObjectOutputStream
和ObjectInputStream
我写些主要的步骤:1)服务器:
ListenThread.serversocket=new ServerSocket(Config.port);
Socket clientsocket=serversocket.accept();
(new MainThread(clientsocket)).start();2)客户端
socket = new Socket(ip,port);    //连接
this.in = socket.getInputStream();
this.din = new DataInputStream(in);
this.objectInStream=new ObjectInputStream(in);
this.out=socket.getOutputStream();
this.dout=new DataOutputStream(out);
this.objectStream=new ObjectOutputStream(out);//登陆
dout.writeUTF(Constant.CMD_LOGIN);
dout.writeInt(id);
dout.writeUTF(password);
dout.writeInt(stat);int msg = din.readInt();  //等待读取登陆结果Socket连接正常但是客户端等待读取这里很奇怪....
如果把客户端那句this.objectStream=new ObjectOutputStream(out);删除了
就一点问题都没有。但是如果加上了,就在读这里阻塞了
可以保证服务器一点问题都没有,也可以保证收发次序一样....
因为如果删除
this.objectStream=new ObjectOutputStream(out); 其他的聊天什么的都可以..
我就是不明白这句话为什么会有这么大的作用??
即使根本没有调用过this.objectStream
请教大家

解决方案 »

  1.   

    ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过使用流中的文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。 
    writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。
      

  2.   

    上面的问题我自己解决了,原来在初始化Socket输入输出流的时候,客户端和服务器端的顺序应该相反而且要对称....可是现在又出现个小问题:
    我把一个包含图片的对象通过ObjectOutputStream()  writeObject()后发给好友,中间
    服务器接收到正常,再转发给你的好友也OK;
    但是第二次,我改变了内容(包括图片),再发送。服务器接收到的还是上一次的内容...不知道为什么我在writeObject()后添加了flush().服务器竟然都接收不到了
    。。郁闷啊.....
      

  3.   

    ”服务器接收到的还是上一次的内容“
    我感觉可能是缓冲区的问题.....
    但为什么FLUSH()之后,那边会有问题  
    感觉Socket里面的流很不好用....
      

  4.   

    是不是图片太大了,超过了缓冲区的范围??
    TCP数据包的最大数据量也就是65536字节,大约64KB,如果一次传输的数据过大,很可能就接受不到了,最好还是分块传送。
      

  5.   

    最近貌似有很多人做类似QQ的东东:)
    up