110,567
社区成员
发帖
与我相关
我的任务
分享
public SocketManager(string ip, int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress _ip = IPAddress.Parse(ip);
_endPoint = new IPEndPoint(_ip, port);
_listSocketInfo = new Dictionary<string, SocketInfo>();
_DeviceInfo = new Dictionary<string, string>();
}
public void Start()
{
_socket.Bind(_endPoint); //绑定端口
_socket.Listen(50); //开启监听
Thread acceptServer = new Thread(AcceptWork); //开启新线程处理监听
acceptServer.IsBackground = true;
_isListening = true;
acceptServer.Start();
}
public void AcceptWork()
{
while (_isListening)
{
Socket acceptSocket = _socket.Accept();
if (acceptSocket != null && this.OnConnected != null)
{
SocketInfo sInfo = new SocketInfo();
sInfo.socket = acceptSocket;
if (!_listSocketInfo.Keys.Contains(acceptSocket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Add(acceptSocket.RemoteEndPoint.ToString(), sInfo);
}
else
{ //释放上一次建立的链接,重新绑定
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].isConnected = false;
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Shutdown(SocketShutdown.Both);
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()].socket.Close();
_listSocketInfo[acceptSocket.RemoteEndPoint.ToString()] = sInfo;
}
OnConnected(acceptSocket.RemoteEndPoint.ToString());
Thread socketConnectedThread = new Thread(newSocketReceive);
socketConnectedThread.IsBackground = true;
socketConnectedThread.Start(acceptSocket);
}
Thread.Sleep(1000);
}
}
public void newSocketReceive(object obj)
{
Socket socket = obj as Socket;
string EndPoint = socket.RemoteEndPoint.ToString();
SocketInfo sInfo = _listSocketInfo[EndPoint];
sInfo.isConnected = true;
while (sInfo.isConnected)
{
try
{
if (sInfo.socket == null || !sInfo.socket.Connected)
{
LogHelper.WriteDebug("socket=null ip=" + EndPoint);
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(EndPoint))
{
_listSocketInfo.Remove(EndPoint);
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
//这里向系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数
sInfo.socket.BeginReceive(sInfo.buffer, 0, sInfo.buffer.Length, SocketFlags.None, ReceiveCallBack, sInfo.socket.RemoteEndPoint);
}
catch (Exception ex)
{
LogHelper.WriteDebug("【Exception】 Method=newSocketReceive || Exception=" + ex.ToString());
sInfo.isConnected = false;
if (_listSocketInfo.ContainsKey(sInfo.socket.RemoteEndPoint.ToString()))
{
_listSocketInfo.Remove(sInfo.socket.RemoteEndPoint.ToString());
}
var index = "";
foreach (var item in _DeviceInfo)
{
if (item.Value == sInfo.socket.RemoteEndPoint.ToString())
{
index = item.Key;
_DeviceInfo.Remove(index);
break;
}
}
sInfo.socket.Shutdown(SocketShutdown.Both);
sInfo.socket.Close();
return;
}
Thread.Sleep(1000);
}
}