问题描述
TcpClientTcp=newTcpClient(ip.port);stringremsg;while(true){byte[]byt=newbyte[1024*8];Tcp.Client.Receive(byt);//注意这个receiveremsg=Encoding.UTF8.GetString(byt).Trim('');if(remsg=="Do"){byte[]rbyte=newbyte[1024*1024*2];Tcp.Client.Receive(rbyte);//这里的receive会不会被上面的receive影响?}}//endwhile
解决方案
本帖最后由 derek1989 于 2016-05-07 22:27:17 编辑
解决方案二:
除非这方法里啥事都没干,否则肯定有影响
解决方案三:
引用楼主derek1989的回复:
[code=csharp]TcpClientTcp=newTcpClient(ip.port);stringremsg;while(true){byte[]byt=newbyte[1024*8];Tcp.Client.Receive(byt);//注意这个receiveremsg=Encoding.UTF8.GetString(byt).Trim('');
绝不能如此。Receive返回了一个int,表示实际放到byt中的字节数,而这放入的字节可能是“沾包、分包”的结果,怎么能直接GetString呢?
解决方案四:
receive返回值这么重要你都不管了?
解决方案五:
如果当前使用的是面向连接的Socket,那么Receive方法将会读取所有可用的数据,直到达到缓冲区的大小为止;假如你的server端send有两次,第一次内容为Do第二次为Ok你client端第一次receive就有可能读到的数据是Dook切记,读写不是一一对应的
解决方案六:
引用2楼sp1234的回复:
Quote: 引用楼主derek1989的回复:
[code=csharp]TcpClientTcp=newTcpClient(ip.port);stringremsg;while(true){byte[]byt=newbyte[1024*8];Tcp.Client.Receive(byt);//注意这个receiveremsg=Encoding.UTF8.GetString(byt).Trim('');绝不能如此。Receive返回了一个int,表示实际放到byt中的字节数,而这放入的字节可能是“沾包、分包”的结果,怎么能直接GetString呢?
那我这段代码应该如何修改才能正常运行呢?
解决方案七:
引用3楼dongxinxi的回复:
receive返回值这么重要你都不管了?
返回值?何解?新手求解答
解决方案八:
你应该去看每个函数的介绍,有示例代码,想想为什么,官方帮助文档很全面的。tcp内容很多的,你的代码中忽略真的太多,想深入的话,看看tcp协议!返回值会告诉你接收数据的长度。