一个客户端接受包,一个服务器端不停的发包,比如一次发1K。
我客户端用socket收的时候,存放的数组也是定义的1k大小
如:
byte[] buffer = new byte[1024];
socket.receive(buffer);现在问题是他有时候收到的只有一部分,剩下一部分是下一次收才能收到?
这是不是我收的时候服务器端还没有完全发完1个包啊?必须循环收才能确保收完?
还有就是如果必须循环收那我怎么区分每个包呢?每个包最后虽然是有一个结束标记,但是我要挨个字节去比对吗?这样效率是不是太低了?
我客户端用socket收的时候,存放的数组也是定义的1k大小
如:
byte[] buffer = new byte[1024];
socket.receive(buffer);现在问题是他有时候收到的只有一部分,剩下一部分是下一次收才能收到?
这是不是我收的时候服务器端还没有完全发完1个包啊?必须循环收才能确保收完?
还有就是如果必须循环收那我怎么区分每个包呢?每个包最后虽然是有一个结束标记,但是我要挨个字节去比对吗?这样效率是不是太低了?
解决方案 »
- 求大虾指教~
- C#里调用DLL的问题
- 在gridview控件里删除最后条记录时出现错误,不是最后条记录没问题!!!急!!!
- _UIContentControl=new UIContentControl(this);这里this的用法有什么好处?
- 异步本来就是多线程,可以支持多个用户同时连接,用异步写服务器还用在thread线程吗?
- C#.NET2005
- 错误:远程服务器返回错误: (403) 已禁止
- 哪位兄弟能提供c#的winform安装文件制作的比较好的资料,谢谢了
- 在南京有一年工作经验的.net程序员月薪多少
- 我建了两个项目,现在一个项目中要引用另一个,怎么引用?
- 关于字符串
- 无法将类型char隐式转换为string?
也就是说你要用这个Receive来收包
public int Receive (
byte[] buffer,
int size,
SocketFlags socketFlags
)参数
buffer
Byte 类型的数组,它是存储接收到的数据的位置。 size
要接收的字节数。 socketFlags
SocketFlags 值的按位组合。
byte[] buffer,
int size,
SocketFlags socketFlags
)用这个可以指定收多少字节吗?就是说如果缓冲区没有到我要接受的这么多字符,那么它会等待吗?
基本上这1024内已经包括头信息了,
读取里面的 Content-Length: 888
然后根据这个长度,就知道下面继续读多少了循环开线程接收
Socket client;
int recvCount;
int availCount;
int income = 0;
byte[] recvBytes = new byte[8*1024];
do
{
availCount = client.Available; if (income == 0)
{
income++;
continue;
}
if (availCount <= 0 && income>0)
break; if (availCount < 8*1024)
{
recvCount = client.Receive(recvBytes, availCount, SocketFlags.None);
}
else
{
recvCount = client.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
} income++;
data += Encoding.UTF8.GetString(recvBytes, 0, recvCount); }
while (availCount > 0);