111,126
社区成员
发帖
与我相关
我的任务
分享
private void AsynReceiveHead(IAsyncResult ar)
{
int octs = 0;
Socket sock = (Socket)ar.AsyncState;
octs = sock.EndReceive(ar);//就是这里几乎每次都返回0字节,必须再次接受才能获得真正的包,而有时候连真正的包也接收不到
if(xxx)
{
.
.
.
sock.BeginReceive(BUFF, 0, SIZE, SocketFlags.None, AsynReceiveHead, sock);//继续接受下个包
}
else if(yyy)
{
.
.
.
sock.BeginReceive(BUFF, 0, ContentSize, SocketFlags.None, AsynReceiveContent, sock);//接受包的内容
}
sock.BeginReceive(BUFF, 0, SIZE, SocketFlags.None, AsynReceiveHead, sock);//再其他情况下都继续接收下个包
}
private void AsynReceiveContent(IAsyncResult ar)
{
int octs = 0;
Socket sock = (Socket)ar.AsyncState;
octs = sock.EndReceive(ar);//而在这里几乎不会返回0字节的包
if(xxx)
{
.
.
.
sock.BeginReceive(BUFF, 0, SIZE, SocketFlags.None, AsynReceiveHead, sock);//继续接收下个包
}
else if(yyy)
{
.
.
.
.
sock.BeginSend(BUFF, 0, SIZE, SocketFlags.None, AsynSend, sock);//发送消息结果
}
}
List<Request> listRequest;//储存收到来自服务端的消息列表
void threadReceive()
{
while(true)
{
socket.Receive(buff, 0, length, SocketFlags.None);
.
.
.
if(消息头里有内容)
{
socket.Receive(buff, 0, length, SocketFlags.None);
}
.
.//继续处理消息包
.
lock(listRequest)
{
listRequest.Add(new Request(buff));//添加到消息包列表里
}
}
}
void threadHandleAndSend()
{
List<Request> requests;
while(true)
{
lock(listRequest)
{
if(listRequest.Count>0)
{
//那么就把listRequest复制到request里并且清空listRequest
.
.
.//继续处理消息
}
}
if(需要发送消息)
{
sock.Send(data, 0, data.Length, SocketFlags.None);
}
}
}
player.SOCKET.BeginReceive(player.BUFF, 0, MessageHead.SIZE, SocketFlags.None, AsynReceiveHead, player);//接受包头
if (head.size!= 0)
{
player.SOCKET.BeginReceive(player.BUFF, MessageHead.SIZE, head.size, SocketFlags.None, AsynReceiveContent, player);//继续接收内容,在buff里的offset是从包头之后开始的
}
16 Information: DD is in free... -14:19:40
17 ERROR: DD has send a empty message, ID Player: 2 -14:19:40
18 Information: DD is in waiting... -14:19:40
///下面是SS发送的3个包,但是只有出现一次返回空包的情况。
///19号Log是只有包头的消息报
///21号是带消息内容的消息包
///22号是带消息内容的消息包
///看的出来这里也出现了一次先返回空消息,不知道是不是不带消息内容也就是不调用ReceiveContent的就不会出现先返回空包的情况
19 Information: Player SS ask for information... -14:19:41
20 Error: SS has send a empty message, ID Player: 3 -14:19:43
21 Information: SS ask for play with DD -14:19:43
22 Information: SS is ready, now he is waiting for DD -14:19:44
///之后这个本来是DD发送了同意的消息包,这个包是带内容的,就是和22号Log一样的包,就是不知道为什么
///就返回了0包后就没其他动作了、、、
23 Error: DD has send a empty message, ID Player: 2 -14:19:46 foreach(byte[] cmd in commands)
{
解析命令并且返回结果(sock, cmd);
} foreach(byte[] cmd in commands)
{
解析命令并且返回结果(sock, cmd);
}这这个方法都可以异步并发执行,而不需要按照客户端发送消息的次序来返回各个消息处理结果。private void AsynReceiveMessages(IAsyncResult ar)
{
int octs = 0;
Socket sock = (Socket)ar.AsyncState;
octs = sock.EndReceive(ar);
if(octs>0)
{
将BUFF中前octs个字节累积起来//例如放到一个MemoryStream中,或者List<byte[]>集合中。
}
if(octs==0 || BUFF[octs-1]附近的字节是以消息结束符结束的)
{
var commands = 从这个MemoryStream中或者List<byte[]>集合中取出一个或者多个消息内容;
foreach(byte[] cmd in commands)
{
解析命令并且返回结果(sock, cmd);
}
}
sock.BeginReceive(BUFF, 0, SIZE, SocketFlags.None, AsynReceiveMessages, sock);
}