今天写局域网聊天程序时遇到一个问题,就是 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。。。。

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

Java Socket编程中使用ObjectOutputStream 和 ObjectInputStream 出现问题相关推荐

  1. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  2. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  3. socket编程中常见的概念问题!

    socket编程一般指的就是网络编程,常见的服务端和客户机都是必不可少的,今天小千就来给大家介绍一下socket编程中常见的概念问题. 一.常见传输协议 1.tcp协议 TCP (Transmissi ...

  4. JAVA socket编程 Datagram套接字 UDP协议(转)

      查看文章     JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...

  5. Java Socket编程----通信是这样炼成的

    转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...

  6. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  7. IP地址的三种表示格式及在Socket编程中的应用

    转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其 ...

  8. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  9. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

最新文章

  1. Google 开发新的开源系统 Fuchsia
  2. always@( )列表里不能同时有电平敏感事件和边沿触发事件
  3. .Net新手☞数据库操作
  4. linux 查看服务器性能常用命令
  5. 使用awk用一个列替换另一个文件中的列?
  6. 非会员只能试看20分钟_做欧包都要把铁锅烤半小时?太费电了,用我这办法只需预热几分钟...
  7. pyspark与jupyter集成
  8. 使用h5py操作hdf5文件
  9. java程序员期望薪资_11月程序员平均薪资达14327元,薪资最高的居然不是JAVA?
  10. subsring 截取
  11. GitHub上常用命令(工作中几乎每天用到的命令)
  12. 基于情感词典的文本情感分析(附代码)
  13. ubuntu环境下如何设置开机启动项
  14. 数据库SQL(基础代码)
  15. 如何把拼音放在文字的右侧,干货到,在WORD中怎么把拼音和汉字同排
  16. 数码管显示原理——MCU51
  17. flink 复postgresql数据库数据
  18. [python3][题解]拖拉机
  19. H5在苹果手机里唤起输入框后底部出现白条
  20. 12[红+绿+蓝+Alpha]

热门文章

  1. 如何成为一名优秀的高级C/C++程序员
  2. 情人节,找个程序员当男朋友,一般都不会太差
  3. python找图里的环_python判断无向图环是否存在的示例
  4. 内蒙古农大孙志宏教授证实超深度混合宏基因组测序能够对人类肠道微生物组中的低丰度物种进行基因组和功能表征...
  5. Venn网络展示富集分析结果
  6. 使用Lock and Load X 插件时导致Final Cat Pro意外退出的解决办法
  7. 大学生换学校学计算机,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
  8. python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
  9. java 调用jira_java中通过JIRA REST Java Client 使用jira
  10. vue项目路径修改及打包上传到服务器