socket

HYH 2011-05-31 02:53:53

byte[] byteMessage = new byte[100];
Socket newSocket = socket.Accept();
newSocket.Receive(byteMessage);

服务器端接受传过来的byte数组,但是不知道这个byte数组有多长,请问怎么准确的取到传过的byte数组?
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cycwind 2011-07-29
  • 打赏
  • 举报
回复
public override int Read(byte[] buffer, int offset, int size)
System.Net.Sockets.NetworkStream 的成员

摘要:
从 System.Net.Sockets.NetworkStream 读取数据。

参数:
buffer: 类型 System.Byte 的数组,它是内存中用于存储从 System.Net.Sockets.NetworkStream 读取的数据的位置。
offset: buffer 中开始将数据存储到的位置。
size: 要从 System.Net.Sockets.NetworkStream 中读取的字节数。

返回值:
从 System.Net.Sockets.NetworkStream 中读取的字节数。
SunnyWun 2011-07-21
  • 打赏
  • 举报
回复
可以写个协议啊%……
HYH 2011-06-01
  • 打赏
  • 举报
回复
sp1234说的很高深,是不是要用个标识来表示发送过的数据结尾,或者像ericsg说的“前面加固定的几个BYTE来表明长度”,我试验一下

加标识的话,会不会和发送过来的数据的某一段重复啊?这样提早结束接受,容易出现错误判断
cy19851024 2011-05-31
  • 打赏
  • 举报
回复
是不是前面加固定的几个BYTE来表明长度
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hyh553879809 的回复:]

谢谢各位,我用了一个循环,不停的接受,把接受的不同长度的byte[]转换并拼成string,直到返回的byte[]长度为零为止
[/Quote]
这肯定是不对的。我记得你问过这个问题。

假设客户端一下子(仅使用一个Send语句)发送2000字节,服务器端的buffer的大小是10KBytes,假设网络质量不是很好的情况下,服务器端完全可能只能接收到1800字节,然后接收缓冲区里就变成0字节了,然后过了一瞬间才继续接收到剩下的200字节。

假设客户端并发或者连续发送2000字节、20000字节共两个消息,服务器端的buffer的大小是10KBytes,由于TCP是延迟缓发送的,底层会把数据包组合在一起来发送,所以服务器又可能首先收到10000个字节,然后又收到 11000个字节,第三次又收到1000个字节。

所以不指定高层次的设计,只拿网上那种所谓的点对点“通讯”的范例作为编程,是不对的。
HYH 2011-05-31
  • 打赏
  • 举报
回复
谢谢各位,我用了一个循环,不停的接受,把接受的不同长度的byte[]转换并拼成string,直到返回的byte[]长度为零为止
  • 打赏
  • 举报
回复
通讯中消息可能有各种长度。比如即时聊天用户给对方发送一个文字或者图片消息,消息内容的长度就是变动的。消息的长度是使用信令协议来规范的,不是某种“技术概念”之类死的东西。
  • 打赏
  • 举报
回复
我给你举几个例子吧:

1. 比如XMPP那种,它接收到的字符串流,事实被SAX之类的解析器解析为一个一个数据描述节点。

2. 比如msdn那种,它是以换行回车(\r\n)作为一个消息的结束标志。

3. 比如http post命令那种,它是以连续两个换行来作为消息头的结束,然后消息体部分再以连续两个换行作为结束。


总之你要动手自己去设计。
bdmh 2011-05-31
  • 打赏
  • 举报
回复
accept不是接受数据,而是接受客户端套接字,你应该用Select和Receive方法,自己看帮助

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧