最近在写一个网络通信的程序:
程序是这么设计的:(所有这些代码都是在一个类中的)
在主线程中启动监听线程:
ThreadStart ts = new ThreadStart(AcceptConnect);
Thread myThread = new Thread(ts);
myThread.Start();
用AcceptConnect()方法处理连接
AcceptConnect()方法:
private void AcceptConnect()
{
try
{
listener = new TcpListener(10001);
listener.Start();
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
return;
}
while (!isExit)
{
try
{
//将事件的状态设为非终止
allDone.Reset();
//应用在异步操作完成时调用的回调方法
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
lbxStatus.Invoke(setListBoxCallback, "等待客户连接...");
//开始一个异步操作接受传入的连接尝试
listener.BeginAcceptTcpClient(callback, listener);
//阻塞当前线程,直到收到客户连接信号
allDone.WaitOne();
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
break;
}
}
} //ar是IAsyncResult类型的接口,表示异步操作的状态
//是由listerner.BeginAcceptTcpClient(callback, listener)传递过来的
private void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
//将事件状态设为终止状态,允许一个或多个等待线程继续
//使监听线程得以继续
allDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
//异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信
TcpClient client = myListener.EndAcceptTcpClient(ar);
//如果IP为192.168.1.50,回调方法用UltraReadCallback()
if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.50")
{
ReceiveRWObject = readWriteObject;
ReceiveRWObject.netStream.BeginRead(ReceiveRWObject.readBytes, 0, ReceiveRWObject.readBytes.Length, UltraReadCallback, ReceiveRWObject);
}
//如果IP为192.168.1.51,回调方法用UltraReadCallback2()
if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.51")
{
ReceiveRWObject2 = readWriteObject;
ReceiveRWObject2.netStream.BeginRead(ReceiveRWObject2.readBytes,0,ReceiveRWObject2.readBytes.Length,UltraReadCallback2,ReceiveRWObject2);
}
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
return;
}
} //IP为.50的回调方法
private void UltraReadCallback(IAsyncResult ar)
{
try
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int count = readWriteObject.netStream.EndRead(ar);
//这样调用一个函数可以么?
JointDistance(readWriteObject.readBytes[0]);
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
}
} //IP为.51的回调方法
private void UltraReadCallback2(IAsyncResult ar)
{
try
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int count = readWriteObject.netStream.EndRead(ar);
//这样调用一个方法可以么?
JointDistance51(readWriteObject.readBytes[0]);
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
} catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
}
}
//JointDistance()
private void JointDistance(byte s)
{
}
//JointDistance51()
private void JointDistance51(byte s)
{
}
我在主线程中又开了另一个线程,委托给这个方法处理:
private void UltraLocation()
{
}
我这个程序要实现的功能为:在UltraLocation()发送一个特定的码之后,192.168.1.50和192.168.1.51分别回传一个数据,数据接收的回调方法分别为上面的UltraReadCallback()和UltraReadCallback2(),这两个方法把数据分别交给JointDistance()和JointDistance51()处理,在这两个方法处理完数据之后,要求他们告诉UltraLocation()他们已经处理完了,让UltraLocation()发送下一个码,UltraLocation在收到JointDistance()和JointDistance51()的确认之前,是阻塞的。之后192.168.1.50和192.168.1.51回传数据,然后这样循环下去。(关于192.168.1.50和192.168.1.51怎样回传数据,大家可以不必关心,这个倒是没问题了)想问问大家,这个用什么实现比较好?用AutoResetEvent或者ManualResetEvent可以不?EventWaitHandle呢?还有若这段代码有什么问题,请大家赐教!在此先谢谢了!
程序是这么设计的:(所有这些代码都是在一个类中的)
在主线程中启动监听线程:
ThreadStart ts = new ThreadStart(AcceptConnect);
Thread myThread = new Thread(ts);
myThread.Start();
用AcceptConnect()方法处理连接
AcceptConnect()方法:
private void AcceptConnect()
{
try
{
listener = new TcpListener(10001);
listener.Start();
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
return;
}
while (!isExit)
{
try
{
//将事件的状态设为非终止
allDone.Reset();
//应用在异步操作完成时调用的回调方法
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
lbxStatus.Invoke(setListBoxCallback, "等待客户连接...");
//开始一个异步操作接受传入的连接尝试
listener.BeginAcceptTcpClient(callback, listener);
//阻塞当前线程,直到收到客户连接信号
allDone.WaitOne();
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
break;
}
}
} //ar是IAsyncResult类型的接口,表示异步操作的状态
//是由listerner.BeginAcceptTcpClient(callback, listener)传递过来的
private void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
//将事件状态设为终止状态,允许一个或多个等待线程继续
//使监听线程得以继续
allDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
//异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信
TcpClient client = myListener.EndAcceptTcpClient(ar);
//如果IP为192.168.1.50,回调方法用UltraReadCallback()
if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.50")
{
ReceiveRWObject = readWriteObject;
ReceiveRWObject.netStream.BeginRead(ReceiveRWObject.readBytes, 0, ReceiveRWObject.readBytes.Length, UltraReadCallback, ReceiveRWObject);
}
//如果IP为192.168.1.51,回调方法用UltraReadCallback2()
if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.51")
{
ReceiveRWObject2 = readWriteObject;
ReceiveRWObject2.netStream.BeginRead(ReceiveRWObject2.readBytes,0,ReceiveRWObject2.readBytes.Length,UltraReadCallback2,ReceiveRWObject2);
}
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
return;
}
} //IP为.50的回调方法
private void UltraReadCallback(IAsyncResult ar)
{
try
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int count = readWriteObject.netStream.EndRead(ar);
//这样调用一个函数可以么?
JointDistance(readWriteObject.readBytes[0]);
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
}
catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
}
} //IP为.51的回调方法
private void UltraReadCallback2(IAsyncResult ar)
{
try
{
ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
int count = readWriteObject.netStream.EndRead(ar);
//这样调用一个方法可以么?
JointDistance51(readWriteObject.readBytes[0]);
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
} catch (Exception err)
{
lbxStatus.Invoke(setListBoxCallback, err.Message);
}
}
//JointDistance()
private void JointDistance(byte s)
{
}
//JointDistance51()
private void JointDistance51(byte s)
{
}
我在主线程中又开了另一个线程,委托给这个方法处理:
private void UltraLocation()
{
}
我这个程序要实现的功能为:在UltraLocation()发送一个特定的码之后,192.168.1.50和192.168.1.51分别回传一个数据,数据接收的回调方法分别为上面的UltraReadCallback()和UltraReadCallback2(),这两个方法把数据分别交给JointDistance()和JointDistance51()处理,在这两个方法处理完数据之后,要求他们告诉UltraLocation()他们已经处理完了,让UltraLocation()发送下一个码,UltraLocation在收到JointDistance()和JointDistance51()的确认之前,是阻塞的。之后192.168.1.50和192.168.1.51回传数据,然后这样循环下去。(关于192.168.1.50和192.168.1.51怎样回传数据,大家可以不必关心,这个倒是没问题了)想问问大家,这个用什么实现比较好?用AutoResetEvent或者ManualResetEvent可以不?EventWaitHandle呢?还有若这段代码有什么问题,请大家赐教!在此先谢谢了!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货