完善基本模式的监听断开处理

This commit is contained in:
sin365 2024-06-18 11:52:30 +08:00
parent 25ad38edc5
commit ae44b8eba9
4 changed files with 63 additions and 48 deletions

View File

@ -257,36 +257,41 @@ namespace HaoYueNet.ClientNetwork
OnReceiveData(CmdID, Error, resultdata); OnReceiveData(CmdID, Error, resultdata);
} }
MemoryStream reciveMemoryStream = new MemoryStream();//开辟一个内存流
MemoryStream memoryStream = new MemoryStream();//开辟一个内存流 byte[] reciveBuffer = new byte[1024 * 1024 * 2];
private void Recive(object o) private void Recive(object o)
{ {
var client = o as Socket; var client = o as Socket;
//MemoryStream memoryStream = new MemoryStream();//开辟一个内存流
while (true) while (true)
{ {
byte[] buffer = new byte[1024 * 1024 * 2]; int effective = 0;
int effective=0;
try try
{ {
effective = client.Receive(buffer); effective = client.Receive(reciveBuffer);
if (effective == 0) if (effective == 0)//为0表示已经断开连接
{ {
continue; //清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//远程主机强迫关闭了一个现有的连接
OnCloseReady();
return;
} }
} }
catch(Exception ex) catch(Exception ex)
{ {
//清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//远程主机强迫关闭了一个现有的连接 //远程主机强迫关闭了一个现有的连接
OnCloseReady(); OnCloseReady();
return; return;
//断开连接 //断开连接
} }
reciveMemoryStream.Write(reciveBuffer, 0, effective);//将接受到的数据写入内存流中
memoryStream.Write(buffer, 0, effective);//将接受到的数据写入内存流中 byte[] getData = reciveMemoryStream.ToArray();//将内存流中的消息体写入字节数组
byte[] getData = memoryStream.ToArray();//将内存流中的消息体写入字节数组
int StartIndex = 0;//设置一个读取数据的起始下标 int StartIndex = 0;//设置一个读取数据的起始下标
while (true) while (true)
@ -314,10 +319,10 @@ namespace HaoYueNet.ClientNetwork
*/ */
//流复用的方式 不用重新new申请 //流复用的方式 不用重新new申请
memoryStream.Position = 0; reciveMemoryStream.Position = 0;
memoryStream.SetLength(0); reciveMemoryStream.SetLength(0);
memoryStream.Write(getData, StartIndex, getData.Length - StartIndex);//从新将接受的消息写入内存流 reciveMemoryStream.Write(getData, StartIndex, getData.Length - StartIndex);//从新将接受的消息写入内存流
break; break;
} }
else else
@ -334,14 +339,13 @@ namespace HaoYueNet.ClientNetwork
//用Span //用Span
Span<byte> getData_span = getData; Span<byte> getData_span = getData;
getData_span = getData_span.Slice(StartIndex + 4,CoreLenght); getData_span = getData_span.Slice(StartIndex + 4, CoreLenght);
DataCallBackReady(getData_span.ToArray()); DataCallBackReady(getData_span.ToArray());
StartIndex += HeadLength;//当读取一条完整的数据后,读取数据的起始下标应为当前接受到的消息体的长度(当前数据的尾部或下一条消息的首部) StartIndex += HeadLength;//当读取一条完整的数据后,读取数据的起始下标应为当前接受到的消息体的长度(当前数据的尾部或下一条消息的首部)
} }
} }
} }
} }
} }

View File

@ -189,39 +189,45 @@ namespace HaoYueNet.ClientNetwork.OtherMode
OnReceive(socket,data); OnReceive(socket,data);
} }
MemoryStream reciveMemoryStream = new MemoryStream();//开辟一个内存流
byte[] reciveBuffer = new byte[1024 * 1024 * 2];
private void Recive(object o) private void Recive(object o)
{ {
MemoryStream memoryStream = new MemoryStream();//开辟一个内存流
var client = o as Socket; var client = o as Socket;
//MemoryStream memoryStream = new MemoryStream();//开辟一个内存流
while (true) while (true)
{ {
byte[] buffer = new byte[1024 * 1024 * 2];
int effective = 0; int effective = 0;
try try
{ {
effective = client.Receive(buffer); effective = client.Receive(reciveBuffer);
if (effective == 0) if (effective == 0)//为0表示已经断开连接放到后面处理
{ {
continue; //清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//远程主机强迫关闭了一个现有的连接
OnCloseReady(client);
return;
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
//清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//远程主机强迫关闭了一个现有的连接 //远程主机强迫关闭了一个现有的连接
OnCloseReady(client); OnCloseReady(client);
return; return;
//断开连接 //断开连接
} }
if (effective > 0)//如果接受到的消息不为0不为空
{ reciveMemoryStream.Write(reciveBuffer, 0, effective);//将接受到的数据写入内存流中
memoryStream.Write(buffer, 0, effective);//将接受到的数据写入内存流中 DataCallBackReady(client, reciveMemoryStream.ToArray());
DataCallBackReady(client, memoryStream.ToArray()); //流复用的方式 不用重新new申请
//流复用的方式 不用重新new申请 reciveMemoryStream.Position = 0;
memoryStream.Position = 0; reciveMemoryStream.SetLength(0);
memoryStream.SetLength(0);
}
} }
} }

View File

@ -192,39 +192,44 @@ namespace HaoYueNet.ClientNetwork.OtherMode
OnReceiveData(data); OnReceiveData(data);
} }
MemoryStream memoryStream = new MemoryStream();//开辟一个内存流 MemoryStream reciveMemoryStream = new MemoryStream();//开辟一个内存流
byte[] reciveBuffer = new byte[1024 * 1024 * 2];
private void Recive(object o) private void Recive(object o)
{ {
var client = o as Socket; var client = o as Socket;
//MemoryStream memoryStream = new MemoryStream();//开辟一个内存流
while (true) while (true)
{ {
byte[] buffer = new byte[1024 * 1024 * 2];
int effective = 0; int effective = 0;
try try
{ {
effective = client.Receive(buffer); effective = client.Receive(reciveBuffer);
if (effective == 0) if (effective == 0)//为0表示已经断开连接放到后面处理
{ {
continue; //尝试性,清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//远程主机强迫关闭了一个现有的连接
OnCloseReady();
return;
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
//尝试性,清理数据
reciveMemoryStream.SetLength(0);
reciveMemoryStream.Seek(0, SeekOrigin.Begin);
//断开连接
//远程主机强迫关闭了一个现有的连接 //远程主机强迫关闭了一个现有的连接
OnCloseReady(); OnCloseReady();
return; return;
//断开连接
}
if (effective > 0)//如果接受到的消息不为0不为空
{
memoryStream.Write(buffer, 0, effective);//将接受到的数据写入内存流中
DataCallBackReady(memoryStream.ToArray());
//流复用的方式 不用重新new申请
memoryStream.Position = 0;
memoryStream.SetLength(0);
} }
reciveMemoryStream.Write(reciveBuffer, 0, effective);//将接受到的数据写入内存流中
DataCallBackReady(reciveMemoryStream.ToArray());
//流复用的方式 不用重新new申请
reciveMemoryStream.Position = 0;
reciveMemoryStream.SetLength(0);
} }
} }

View File

@ -414,7 +414,7 @@ namespace HaoYueNet.ServerNetwork
} }
else else
{ {
//尝试性,清理数据 //清理数据
token.memoryStream.SetLength(0); token.memoryStream.SetLength(0);
token.memoryStream.Seek(0, SeekOrigin.Begin); token.memoryStream.Seek(0, SeekOrigin.Begin);