Java Socket编程中使用ObjectOutputStream 和 ObjectInputStream 出现问题

来源:互联网 发布:什么软件听书免费 编辑:程序博客网 时间:2024/04/29 17:57

今天写局域网聊天程序时遇到一个问题,就是 A给B发送消息1,然后发送消息2,B只能接受到2个消息1。截图是这样的:


在发送了 一个消息 你好 和一个消息 我是xxx 之后,另一端只能收到两次你好

解决办法就是在 ObjectOutputStream的对象发送之前调用 reset()方法,然后 flush;


代码如下:

package com.net;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.InetAddress;import java.net.Socket;import javax.swing.JTextArea;import com.protocol.netData;import com.protocol.netData.TYPE;public class chatSocketwithPro extends Thread{//自带协议的传输Socket chatSocket; ObjectOutputStream oos ;ObjectInputStream ois ;JTextArea showText;StringBuilder sb ;private netData recvdata,senddata; public chatSocketwithPro(Socket s) {sb = new StringBuilder();senddata = new netData(); this.chatSocket = s; try {oos = new ObjectOutputStream(chatSocket.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {          read();}public void read(){try {ois = new ObjectInputStream(chatSocket.getInputStream());while(true){recvdata = null;recvdata = (netData) ois.readObject();TYPE p = recvdata.getType();if ( p.equals(TYPE.TYPE_CHAT)){//如果是聊天数据String text = showText.getText();sb.setLength(0);sb.append(text);sb.append(recvdata.getNeckName()+":   "+recvdata.getData()+"\n");showText.setText(sb.toString());}else if( p.equals(TYPE.TYPE_FILE_REQ)){//如果是文件请求}else if( p.equals(TYPE.TYPE_FILE_END)){//如果是文件尾}else if(p.equals(TYPE.TYPE_FILE_DATA)){//文件数据}else if(p.equals(TYPE.TYPE_OTHER)){//其他数据}else{//未知?}}} catch (IOException e) {e.printStackTrace();System.out.println(e.getMessage());showText.setText(e.getMessage()+"\n对方已关闭聊天");showText.setEnabled(false);} catch (ClassNotFoundException e) {e.printStackTrace();}finally{try {ois.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void write(String message) {senddata.setType(TYPE.TYPE_CHAT);senddata.setData(message);try {//oos.reset();//加了这句就可以了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!oos.writeObject(senddata);oos.flush();} catch (IOException e) {System.out.println(e.getMessage());e.printStackTrace();}}public void closeSocket(){try {this.chatSocket.close();} catch (IOException e) {e.printStackTrace();}}public String getSocketHost(){InetAddress ia =chatSocket.getInetAddress();return ia.getHostAddress();}public void SetShowArea(JTextArea showtextArea) {showText = showtextArea;}}



猜想是这样的: ObjectInputStream 需要 OutPutStream的header,不然就会一直阻塞。第一个消息正常发送之后,第二次发送可能会需要另一header,然后第二次消息发送之后没有header,无法解析,就使用了第一次的Object。。。。

不知道这样对不对,希望大神们指点一二

0 0
原创粉丝点击