public Socket Client { get; private set; }
public MyTcpClient Start(System.Net.IPEndPoint ipEndPoint, Func<IoSession, bool> doWhenAccept, Func<IoSession, bool> heart)
{
System.Diagnostics.Trace.WriteLine("准备连接" + DateTime.Now);
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs connectAsyncEventArgs = new SocketAsyncEventArgs();
connectAsyncEventArgs.UserToken = this;
connectAsyncEventArgs.RemoteEndPoint = ipEndPoint;
bool first = false;
System.Threading.ManualResetEvent evStart = new System.Threading.ManualResetEvent(false);
connectAsyncEventArgs.Completed += (s, e) =>
{
if (e.SocketError == SocketError.ConnectionRefused)
{
System.Threading.Thread.Sleep(3000);
Client.ConnectAsync(e);
System.Diagnostics.Trace.WriteLine("无法连接,重试" + DateTime.Now);
}
else
{
IoSession ioSession = new IoSession(Client, null);
Client.Send(new byte[] { (byte)0 });
#region 心跳
if (!first)
{
first = true;
System.Threading.RegisteredWaitHandle handle = null;
handle = System.Threading.ThreadPool.RegisterWaitForSingleObject(evStart,
(sender, flag) =>
{
if (Client != null && Client.Connected)
heart(ioSession);
else
{
Client = null;
System.Diagnostics.Trace.WriteLine("连接断开,重连" + DateTime.Now);
handle.Unregister(null);//停止心跳
Start(ipEndPoint, doWhenAccept, heart);
}
}, null, 15000, false);
}
#endregion
doWhenAccept(ioSession);
}
};
Client.ConnectAsync(connectAsyncEventArgs);
return this;
}
以上代码实现连接的建立、维持(心跳)及断线重连。非阻塞模式。不需要WHILE和SLEEP。