socket-objectinputstream readobject 为何只能读取第一次写入的值

问题描述

objectinputstream readobject 为何只能读取第一次写入的值

public class TransEntity implements Serializable//传输信息实体封装类
{
private static final long serialVersionUID = 1L;
private String operaType;//用户操作类型;如发送文本消息,发送语音消息,发送音频消息
private String responseTags;//网络响应状态;如“登录成功”、“登录失败”、“注册成功”、“注册失败”
private String requestTags;//网络请求标记;请求发送文本消息,语音消息,音频消息
private User sender;//发送方;
private User receiver;//接收方;
private ArrayList> buddylist;//好友列表信息;
private String time;//系统时间;
private ArrayList> inputGeneralMsgList;//通用信息
private HashMap outGeneralMsgMap;
private String path;

public String getUserOperaType()
{
return operaType;
}
public void setUserOperaType(String operaType)
{
this.operaType = operaType;
}
public String getResponseTags()
{
return responseTags;
}
public String setResponseTags(String responseTags)
{
return this.responseTags = responseTags;
}
public void setRequestTags(String requestTags)
{
this.requestTags = requestTags;
}

public String getRequestTags()
{
return requestTags;
}
public User getSender()
{
return sender;
}
public void setSender(User sender)
{
this.sender = sender;
}
public User getReceiver()
{
return receiver;
}
public void setReceiver(User receiver)
{
this.receiver = receiver;
}
public ArrayList> getList()
{
return buddylist;
}
public void setList(ArrayList> buddylist)
{
this.buddylist = buddylist;
}
public String getImagePath()
{
return path;
}
public void setImagePath(String path)
{
this.path = path;
}
public void setGeneralMessagefrom(ArrayList> inputGeneralMsgList)
{
this.inputGeneralMsgList = inputGeneralMsgList;
}
public ArrayList> getGeneralMessagefrom()
{
return inputGeneralMsgList;
}
public void setGeneralMessageto(HashMap outGeneralMsgMap)
{
this.outGeneralMsgMap = outGeneralMsgMap;
}
public HashMap getGeneralMessageto()
{
return outGeneralMsgMap;
}
public void setSysTime(String time)
{
this.time = SysTime.getDateTime();
}
public String getSysTime()
{
return time;
}
}

服务端核心代码

public class ServerThread extends Thread
{
private static ObjectInputStream ois = null;
private static ObjectOutputStream oos = null;
private ArrayList> list = null;
private ArrayList> outgeneralMsgList = null;
private Socket socket = null;

private TransEntity trans = null;
private boolean FLAGS_IsFirstLogin = true;
private boolean FLAGS_LoginSucess = false;
private boolean FLAGS_RegisterSucess = false;
private boolean FLAGS_OnLine = false;
private User user = null;
private User receiver = null;
private Timer timer = new Timer();
public ServerThread(Socket socket)
{
this.socket = socket;
try
{
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
}
catch (IOException e)
{

e.printStackTrace();
}

}
public void run()
{
try
{

while(true)
{

if(socket.isClosed() == false && socket.isConnected() == true)
{

 try
 {

 if(ois!=null)

{
trans = (TransEntity) ois.readObject();

}

 }
 catch(java.net.SocketException e)
 {
     System.out.println("客户端已经关闭。。。。。。。");
     break;
 }
 catch(ClassNotFoundException e)

{
System.out.println("--------空指针异常---------");

}
catch(java.io.EOFException e)
{
System.out.println("客户端已经关闭。。。。。。。");
}

 }

if(trans!=null)
{
user = trans.getSender();
receiver = trans.getReceiver();
if(trans.getUserOperaType()!=null)
{
System.out.println("----------trans.getUserOperaType() :------------"+(trans.getUserOperaType()));
if(FLAGS_IsFirstLogin == true&&(UserOperaType.LOGIN.equals(trans.getUserOperaType())))
{ //首次登录,一般情形下的客户端发过来的登录操作请求做处理,非掉线后的自动登录;
System.out.println("--------server---socket :------"+(socket));
FLAGS_LoginSucess = setLogin();

 }

if(FLAGS_LoginSucess)

{
FLAGS_IsFirstLogin = false;

System.out.println("----------trans.getUserOperaType() :------------"+(trans.getUserOperaType()));

......为何此次只能输出第一次读入的数据
if(UserOperaType.SEND_MESSAGE.equals(trans.getUserOperaType()))
{
System.out.println("-------UserOperaType.SEND_MESSAGE ---------");
System.out.println(trans.getGeneralMessageto().get("outMsg").toString());
if(trans.getGeneralMessageto()!=null)//若getGeneralMessageto()返回值不为空,则可以向数据库写入信息;
{

System.out.println("-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------");
SysCtlVar.dbBasicOperation.writeGeneralMessage(trans);// 发送方 写入普通信息到数据库,如文字消息;
//trans.setGeneralMessageto(null);

}

trans.setUserOperaType(null);
}

oos.writeObject(trans);
oos.flush();

}
}

}

}

}
catch (Exception e)
{
e.printStackTrace();
}
finally
{

}
}

}

客户端核心代码
while(SysCtlVar.FlAGS_LoginSuccess)
{
// System.out.println("--------------while SysCtlVar.FlAGS_LoginSuccess -------------");
try
{

try
{

SysCtlVar.trans = (TransEntity)SysCtlVar.ois.readObject();

if(SysCtlVar.inputGeneralMsgList!=null)
synchronized(SysCtlVar.inputGeneralMsgList)
{
SysCtlVar.inputGeneralMsgList = SysCtlVar.trans.getGeneralMessagefrom();
SysCtlVar.inputGeneralMsgList.notify();
}

synchronized(SysCtlVar.outGeneralMsgMap)
{
try
{
System.out.println("------- SysCtlVar.outGeneralMsgMap.wait----------");
SysCtlVar.outGeneralMsgMap.wait();

//等待直到有输入的时候,才把消息发送出去

System.out.println("---------------客户端: 正在发送消息。。。。。。------------------");
System.out.println("------- SysCtlVar.outGeneralMsgMap:----------"+(SysCtlVar.outGeneralMsgMap.get("outMsg").toString()));
SysCtlVar.trans.setUserOperaType(UserOperaType.SEND_MESSAGE);
SysCtlVar.trans.setGeneralMessageto(SysCtlVar.outGeneralMsgMap);
System.out.println("------- SysCtlVar.trans.getGeneralMessageto():----------"+(SysCtlVar.trans.getGeneralMessageto().get("outMsg").toString()));
try
{

SysCtlVar.oos.writeObject(SysCtlVar.trans);
SysCtlVar.oos.flush();
}
catch (IOException e)
{

e.printStackTrace();
}

}
catch (InterruptedException e)
{

e.printStackTrace();
}

}

}
catch (ClassNotFoundException e)
{

e.printStackTrace();
}
}
catch (StreamCorruptedException e1)
{

e1.printStackTrace();
}
catch (IOException e1)
{

e1.printStackTrace();
}

}
}

客户端 数据输入部分

/**

调试过程中,你将看到客户端输入的消息为h(第一条消息),www(第二条消息),a(第三条消息)

但是服务端只有第二条消息的值;

*/

//------------------发送消息 ----------
//客户端当前会话任务中,选中的消息接收者;
new Thread()
{
public void run()
{
synchronized(SysCtlVar.outGeneralMsgMap)
{
System.out.println("------- 客户端:正在输入要发送的消息----------");
SysCtlVar.outGeneralMsgMap.clear();
SysCtlVar.outGeneralMsgMap.put("outMsg",outMsg);
SysCtlVar.outGeneralMsgMap.put("msgRecver", selectedAccount);
SysCtlVar.outGeneralMsgMap.put("dateTime",SysTime.getDateTime().toString());
SysCtlVar.outGeneralMsgMap.notify();

//输入完毕,通知发送任务执行
}
}
}.start();
调试信息(服务器端)

服务器已启动,正在监听1345端口
----------trans.getUserOperaType() :------------0
--------server---socket :------Socket[addr=/127.0.0.1,port=38516,localport=1345]
------- list!=null : ---------true
[qq]上线了!
----------qq----------
----------trans.getUserOperaType() :------------0
----------trans.getUserOperaType() :------------6
----------trans.getUserOperaType() :------------6
-------------UserOperaType.GET_AVATARS------------6
我想从服务器获取头像
----------trans.getUserOperaType() :------------7
----------trans.getUserOperaType() :------------7
-------UserOperaType.SEND_MESSAGE ---------
www
-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------
insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13')
----------trans.getUserOperaType() :------------7
----------trans.getUserOperaType() :------------7
-------UserOperaType.SEND_MESSAGE ---------
www
-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------
insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13')
----------trans.getUserOperaType() :------------7
----------trans.getUserOperaType() :------------7
-------UserOperaType.SEND_MESSAGE ---------
www
-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------
insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13')
----------trans.getUserOperaType() :------------7
----------trans.getUserOperaType() :------------7
-------UserOperaType.SEND_MESSAGE ---------
www
-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------
insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13')

---------------问题补充---------------
单步调试,客户端的输出流正确发送了每一次的客户端输入数据(36分钟前)删除
对于单步调试追踪的结果:客户端每一次发送的trans(它是TransEntity的实例,被序列化的消息实体对象)都是正确的(即,与客户端输入值相同)。但是服务端有ObjectInputStream读入的trans(它也是TransEntity的实例,被序列化的消息实体对象)却没有改变始终是第一次的值

解决方案

调试i下,我怀疑主要还是网络通讯的问题。

解决方案二:

http://bbs.csdn.net/topics/391023812 是不是跟我的这个问题类似

时间: 2024-11-03 19:42:56

socket-objectinputstream readobject 为何只能读取第一次写入的值的相关文章

用socket传文件时只能读取到10k?救命

问题描述 浪潮的服务器,2003的系统,ip为192.168.109.30给服务器192.168.12.104传文件,程序读取本地文件读到10k左右就不能读了,不知道为什么,最初的时候是可以的,重装系统问题依旧.传小于10k的文件没有问题.用自己笔记本(2003的系统)相同ip,给192.168.12.104传没问题:浪潮服务器给我笔记本传(笔记本配192.168.109.x,一个网段),也没有问题:各位大侠帮分析一下,那的问题?急死我了,是不是需要设置什么地方,还是程序的问题??? 解决方案

U盘只能读取不能写入设置怎么办

解决办法一 1.某个软件限制了U盘的拷贝,找到这个软件重新设置或者卸载 2.系统丢失链接文件,多用几款杀毒软件杀毒并用其自带的系统修复功能修复系统. 3.到设备管理器的通用串行总线控制器里查看,如果有非正常设备,先删除.重启,再试. 4.U盘与USB口接触不良或者USB口版本为1.1,对USB2.0的U盘支持不好.加根USB延长线或者HUB(USB1.1) 5.U盘文件系统混乱,格式化U盘,多种格式都试试,看哪种好用. 6.U盘损坏(可能是晶振,频率12.000,可以到坏盘上拆) 解决U盘只能读

无法在android中写入文件,只能读取文件系统

问题描述 无法在android中写入文件,只能读取文件系统 我想在 android 中写入一个文件. private void writeScoreToFile(BlastScore result) { try{ FileWriter fstream = new FileWriter(CaptureActivity.BLAST_SCORES,true); BufferedWriter out = new BufferedWriter(fstream); out.write(Integer.toS

dll结构体-C#调用DLL结构体,第一次成功,第二次的时候就报错。尝试读取或写入受保护的内存。

问题描述 C#调用DLL结构体,第一次成功,第二次的时候就报错.尝试读取或写入受保护的内存. C++代码 typedef struct tagIDCardData{ char Name[32]; //姓名 char Sex[6]; //性别 char Nation[20]; //名族 char Born[18]; //出生日期 char Address[72]; //住址 char IDCardNo[38]; //身份证号 char GrantDept[32]; //发证机关 char User

socket通信-socket循环发送请求并读取响应时,循环到第二次之后就读不到响应内容

问题描述 socket循环发送请求并读取响应时,循环到第二次之后就读不到响应内容 问题描述: 业务需求是有一个报文数组,我遍历该数组,每取到一个报文串,便通过socket发送至服务端处理,然后读取服务端响应的报文.但是经过反复测试,每次循环第一次的流程是正常的,但是循环到第二次之后,却读不到响应的报文(内容为空).求各路神仙大虾帮我看看(PS:我看过网上很多的帖子,有的人说socket输入流就像一个一次性的杯子,只能使用一次.但是按这样的话,我岂不是每次发送都需要建立socket连接?这样太消耗

server-android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢?

问题描述 android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢? public class MainActivity extends ActionBarActivity { private EditText edOwnPort; private TextView tvOwnIP; SurfaceView sView; SurfaceHolder surfaceHolder; int screenWidth,screenHeight; Camera camer

winform-C# Winform项目中, 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C# Winform项目中, 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. C/C++ 代码,这个是第三方提供的外部方法(调用"华大HD-900身份证阅读器接口函数"):int HD_Read_BaseInfo(char* pBmpData char *pName char *pSex char *pNation char *pBirth char *pAddress char *pCertNo char *pDepartment char *pEffectData

请教各位大神 vs2008只要点击调试就会出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 在vs2008中使用C#编写程序,原来好好的,突然出现的这个问题,无论代码写什么都会出现"尝试读取或写入受保护的内存.这通常指示其他内存已损坏."的错误.同时还会出现"错误2未能找到要求的文件alink.dll"就算新建个项目,只有一个窗体,代码是空的,也会出现这个情况.vs也重装过了问题依旧.系统还原过了问题依旧.我发现打开以前写的代码就可以调试,但是现在新建的项目就不行.新建一个空的也不能运行,控制台的都不行,旧的项目只要修改一个字哪怕就是个变量名也就

Java读取、写入文件如何解决乱码问题_java

读取文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码.ANSI编码等等.二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码.) 因此可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8).而二进制文件可看成是变长编码的,因为是值编码嘛,多少