问题描述
C/S程序中,我在客户端接收服务器端发来的MemoryStream数据。定义://获取网络流NetworkStreamnetworkStream=client.GetStream();//将网络流作为二进制读写对象br=newBinaryReader(networkStream);调用线程:privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br.ReadString();}catch{}string[]splitString=receiveString.Split(',');//服务器端发送bw.write("file,"+file.length);分割出命令,进入switchstringcommand=splitString[0].ToLower();switch(command){case"login"://格式:login,用户名//AddOnline(splitString[1]);break;case"file":MemoryStreamms=newMemoryStream();....Client.Receive(buffer_ms);.....ms.Write(buffer_ms,0,received_len_ms);break;.....}以上将ms通过线程调用,最后Disposed();成功释放。但是在本机测试的时候,服务器端循环间隔10ms向客户端发送内存流,客户端和服务器端在同一台机子上运行正常。但分开来个机子的话,客户端接收不到1s就停止,看任务管理器中,客户端进程的内存在逐渐上升,通过调试,好像在上面的br.ReadString();中的br对象没有释放,但在case"file":代码段中加入br.Dispose();客户端就掉线了,哪位高手知道怎么正确释放该br对象啊?????急急急...感谢感谢
解决方案
解决方案二:
是不是高手还没起床呢啊?
解决方案三:
跟br.Dispose关系不大。一个可能是你服务端的收发规则和客户端不一致。比如客户端只用BinaryReader.ReadString(),但服务端却混合不同的发送(有时发字符串,有时发数据)。
解决方案四:
是不是高手还没起床呢啊?
解决方案五:
//将网络流作为二进制读写对象br=newBinaryReader(networkStream);这东西不是这么用的呀汗privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br.ReadString();你这里循环Read第二个ReadString()后就异常了因为他的指针到流尾如果没数据就异常了,这个不是阻塞线程,BinaryReader只能一次性用,不能复用。每次都要NEW}catch{}
解决方案六:
引用4楼wyd1520的回复:
//将网络流作为二进制读写对象br=newBinaryReader(networkStream);这东西不是这么用的呀汗privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br.ReadString();你这里循环Read第二个ReadString()后就异常了因为他的指针到流尾如果没数据就异常了,这个不是阻塞线程,BinaryReader只能一次性用,不能复用。每次都要NEW}catch{}
那怎么用正确啊?求正确方法啊.....我理解的不深..
解决方案七:
TCP通信,你要取到这个包所有的Byte 然后再把这个Byte[]入到BinaryReader(byte[])然后ReadString(),一个通信包只能用一个BinaryReader..每次都要重新NEW。你要搞这个TCP通信,你先要学会这个文章http://www.cnblogs.com/xiaozhi_5638/p/4244797.html
解决方案八:
引用4楼wyd1520的回复:
//将网络流作为二进制读写对象br=newBinaryReader(networkStream);这东西不是这么用的呀汗privatevoidReceiveData(){stringreceiveString=null;while(isExit==false)//进入循环接收{try{receiveString=br.ReadString();你这里循环Read第二个ReadString()后就异常了因为他的指针到流尾如果没数据就异常了,这个不是阻塞线程,BinaryReader只能一次性用,不能复用。每次都要NEW}catch{}
那怎么用正确啊?求正确方法啊.....我理解的不深..