求解决socket连接异常导致断线
socket多客户端连接,接收数据或反序列化时偶尔发生异常导致断线,异常是偶尔发生,不是每次都出现。求各位帮忙解答,由于系统只给我送100分,解决实际问题的还可再加分。
服务器代码如下:
public void NetWorkServer()
{
IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
//定义socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//定义端点
IPEndPoint ep = new IPEndPoint(ip, 2008);
//绑定端点
socket.Bind(ep);
//最大监听数
socket.Listen(connectNum);
//开启线程监听
listenThread = new Thread(new ThreadStart(listenSocket));
listenThread.IsBackground = true;
listenThread.Start();
}
/// <summary>
/// 监听
/// </summary>
private void listenSocket()
{
while (true)//不停的监听客户端连接请求
{
try
{
chatSocket = socket.Accept();
//开辟线程处理
Thread newChatThread = new Thread(new ThreadStart(beginChat));
newChatThread.IsBackground = true;
newChatThread.Start();
}
catch (Exception ex)
{
log.Error("监听失败");
}
}
}
/// <summary>
/// 接收数据
/// 处理
/// </summary>
private void beginChat()
{
Socket s = chatSocket;
string ep = s.RemoteEndPoint.ToString();//远程ip+端口
string[] str = ep.Split(':');
lock (socketsMap)
{
if (!socketsMap.ContainsKey(str[0]))
{
socketsMap.Add(str[0], s); //保存用户socket
}
else
{
socketsMap[str[0]] = s;
}
}
BinaryFormatter format = new BinaryFormatter();
MemoryStream mem = new MemoryStream();
while (true)
{
#region 方法一,直接从网络流中读取数据
/*
NetworkStream stream = null;
try
{
stream = new NetworkStream(s);
}
catch (IOException)
{
log.Error("客户端关闭");
return;
}
try
{
NetWordMsg msg = (NetWordMsg)format.Deserialize(stream);//这里偶尔出现“在分析完成之前就遇到流结尾”异常
//处理信息,引发事件给DoMsg(String msg)
ReveiveEvent(s, msg);
}
catch (Exception ex)
{
lock (socketsMap)
{
socketsMap.Remove(str[0]);
try
{
s.Disconnect(false);
}
catch (Exception)
{
}
}
s.Close();
s = null;
log.Error("格式化信息失败",ex);
return;
}
*/
#endregion
#region 方法二:发送方法是带长度的方法
byte[] data = new byte[4];
try
{
if (s != null && s.Connected)
{
int revc=0;
try
{
revc = s.Receive(data, 4, SocketFlags.None);//读出数据长度
}
catch (SocketException ex)
{
log.Error("连接关闭", ex);
s.Disconnect(false);
s = null;
}
int size = BitConverter.ToInt32(data, 0);//得到数据长度
int offset = 0;
if (size > 0)
{
data = new byte[size];//接收数据数组
revc = s.Receive(data, size, SocketFlags.None);//此方法偶尔出现“连接已关闭”的异常
mem.Write(data, offset, revc);
offset += revc;
size -= revc;
//mem.Position = 0;
mem.Seek(0, SeekOrigin.Begin);
NetWordMsg msg = (NetWordMsg)format.Deserialize(mem);
//处理信息,引发事件给DoMsg(String msg)
ReveiveEvent(s, msg);
mem = new MemoryStream();
}
}
}
catch (SocketException ex)
{
lock (socketsMap)
{
socketsMap.Remove(str[0]);
try
{
s.Disconnect(false);
}
catch (Exception)
{
}
}
s.Close();
s = null;
log.Error("格式化信息失败", ex);
continue;
}
#endregion
}
}