TCP/IP协议无消息边界问题。 使用NetworkStream 来进行接收,但是接收的是多条客户端传送的,没有消息边界,如何去分辨单独的一条数据? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当你收到消息(按照一块一块buffer来接收),要判断是否达到一条一条消息的结束,然后当达到消息结束的时候,要将已经收到的消息进行解析,解析出一条或者多条消息来。具体来说,类似于using(var dest=new MemoryStream()){ var buffer=new byte[40960]; int len; do{ len=stream.Read(buffer,0,buffer.length); dest.Write(buffer,0,len); }while(len>0 && !判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len)) var datas=dest.ToArray(); 解析datas得到一条或者多条消息然后执行命令(datas);}需要预先执行好协议,说明怎样实现这里的逻辑,才能编码。不写好文档怎么写代码? 根据同步还是异步,上述代码有所不同。比如异步,那么也就根本不出现do...while循环,而是类似这样的代码private MemoryStream dest=new MemoryStream();void MyCallback(IAsyncResult h){ var state=(object[])h.AsyncState; var stream=(NetworkStream)state[0]; var buffer=(byte[])state[1]; var len=stream.EndRead(h); dest.Write(buffer,0,len); if(判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len)) { 解析datas得到一条或者多条消息然后执行命令(datas); dest=new MemoryStream(); } stream.BeginRead(buffer,0,buffer.length,MyCallback,state);} 另外要说一下,tcp不可能“三个客户端发送数据”沾包问题,是同一个客户端TcpClient连续三次发送消息才沾包。你的问题问的很成问题。我通常只回答你的问题刚好够用的答案,你的问题要提得清醒才能看懂我的答案。 多个客户端同时发送也不会数据冲突TCP是按套接字来创建管道的每个客户端的套接字不一样流的管道也不会一样也就是每个客户端之间的流通道是隔离的楼主你看看你的StreamReader,是不是从socket划TCPClient对象获得的啊这不就说明每个客户端的StreamReader不同么 求个简单的正则 WinForm 怎样才能显示颜色选择框 GridView中Columns列宽问题 ------------------------两个数相加--------------------- 怎么能捕获到用户点到的是哪个Textbox? ===关于程序发布到服务器后找不到命名空间问题求解=== 读写xml文件的问题 內部網絡使用的Notes系統,如果用C#編程給它發Mail阿?急!!! 如何使用c#分析图片中各颜色块的高度? 用C#写程序不得不考虑的问题★★★★★ datagridview中实现checkbox Data命名空间
当你收到消息(按照一块一块buffer来接收),要判断是否达到一条一条消息的结束,然后当达到消息结束的时候,要将已经收到的消息进行解析,解析出一条或者多条消息来。具体来说,类似于using(var dest=new MemoryStream())
{
var buffer=new byte[40960];
int len;
do{
len=stream.Read(buffer,0,buffer.length);
dest.Write(buffer,0,len);
}while(len>0 && !判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len))
var datas=dest.ToArray();
解析datas得到一条或者多条消息然后执行命令(datas);
}需要预先执行好协议,说明怎样实现这里的逻辑,才能编码。不写好文档怎么写代码?
private MemoryStream dest=new MemoryStream();void MyCallback(IAsyncResult h)
{
var state=(object[])h.AsyncState;
var stream=(NetworkStream)state[0];
var buffer=(byte[])state[1];
var len=stream.EndRead(h);
dest.Write(buffer,0,len);
if(判断buffer中有效的len个字节是以消息的结束符号结束的(buffer,len))
{
解析datas得到一条或者多条消息然后执行命令(datas);
dest=new MemoryStream();
}
stream.BeginRead(buffer,0,buffer.length,MyCallback,state);
}
TCP是按套接字来创建管道的
每个客户端的套接字不一样
流的管道也不会一样
也就是每个客户端之间的流通道是隔离的
楼主你看看你的StreamReader,是不是从socket划TCPClient对象获得的啊
这不就说明每个客户端的StreamReader不同么