110,528
社区成员
发帖
与我相关
我的任务
分享
private void Connect()
{
Thread tConnect = new Thread(new ThreadStart(ConnectServer));
tConnect.IsBackground = true;
tConnect.Start();
}
private void ConnectServer()
{
MsgBuffer = new Byte[65535];
int timeStart = System.Environment.TickCount;
IPAddress ipAddress = IPAddress.Parse("192.168.6.93");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 1022);
bool bChange = false;
while (true)
{
if (!bConnection)
{
try
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();
}
catch (Exception)
{
if (!bChange)
{
this.Invoke((EventHandler)(delegate
{
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
bChange = true;
}
continue;
}
}
else
{
break;
}
t = new Thread(o => Thread.Sleep(500));
t.Start(this);
while (t.IsAlive)
{
Application.DoEvents();
}
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
client.EndConnect(ar);
connectDone.Set();
MsgBuffer = new Byte[65535];
client.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), client);
this.Invoke((EventHandler)(delegate
{
bConnection = true;
bFirst = true;
txtRcv.Text = "已连接上服务器";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_green.png");
}));
receiveDone.WaitOne();
}
catch (Exception)
{
if (!bchange)
{
this.Invoke((EventHandler)(delegate
{
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
bchange = true;
}
if (!bFirst) ConnectServer();
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
this.Invoke((EventHandler)(delegate
{
string strTemp = Encoding.ASCII.GetString(MsgBuffer, 0, bytesRead);
txtRcv.Text = strTemp;
ShowData(strTemp);
}));
client.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallback), client);
}
else
{
receiveDone.Set();
}
}
catch (Exception)
{
this.Invoke((EventHandler)(delegate
{
bConnection = false;
bFirst = true;
txtRcv.Text = "连接服务器失败,请确认服务器是否正常工作!";
pictureBox1.Image = Image.FromFile(".\\pic\\bullet_red.png");
}));
//client.Close();
//client = null;
ConnectServer();
}
}
void Connect(Socket client, Action callback)
{
client.BeginConnect("...", 1234, ar =>
{
client.EndConnect(ar);
if (callback != null)
callback();
}, null);
}
这种代码,总是有 callback 机制,这就叫做异步。
并不是说弄什么线程才叫异步。往往你要顺着callback 委托的思路设计,在一个事件发生时则回调 callback,这样的程序才简练。
切不可乱用线程,更不可在子线程中写一个死循环代码。void Connect(Socket client, Action callback)
{
//.........
}
void Send(Socket client, byte[] message)
{
try
{
client.Send(message);
}
catch
{
if (!client.Connected)
Connect(client, () =>
{
client.Send(message);
});
}
}
这就是说,在send 的时候知道先连接然后send,这也就重连了。1.客户端服务端不分顺序,任意顺序打开要求能连接上(打开程序就连接,不需要按钮)。 2.在连接过程中,如果关闭客户端,重启客户端(服务端不做任何操作),自动连接上。 3.在连接过程中,如果关闭服务器,重启服务器(客户端不做任何操作),自动连接上。
信号量和bConnection标志位代码位置自己再考虑下
有第三方的 很简单 别自己判断了..