111,094
社区成员




private void StartListen()
{
this.TcpListener = new TcpListener(19808);
this.TcpListener.Start();
while( true )
{
TcpClient TcpClient = this.TcpListener.AcceptTcpClient();
NetworkStream MyStream = TcpClient.GetStream();
byte [] bytes = new byte[2048];
int bytesRead = MyStream.Read(bytes,0,bytes.Length);
string message = System.Text.Encoding.UTF8.GetString(bytes,0,bytesRead);
}
}
private void MainForm_Load(object sender, System.EventArgs e)
{
this.Listener = new Thread(new ThreadStart(StartListen));
this.Listener.Start();
}
while(true)
{
//TcpClient client = server.AcceptTcpClient();//开始监听
//NetworkStream ns = client.GetStream(); //创建网络流,进行读写
TcpClient ClientTCPClient = _TCPListen.AcceptTcpClient();
Thread ReadClientConnectThread = new Thread(new ParameterizedThreadStart(ReadClientDataThreadFun));//用于处理客户端连接的线程,
DTUClient _tmpdtuclient = new DTUClient(ClientTCPClient);//我自己定义的类,里面包含TCPClient和NetworkStream
ReadClientConnectThread.Start(_tmpdtuclient);//启动线程的时候把这个对象传进去
}
//处理客户端连接的函数:
/// <summary>
/// 接收客户端发送的数据的线程的目标函数
/// </summary>
protected void ReadClientDataThreadFun(object obj)
{
DTUClient _tmpdtuclient = (DTUClient)obj;
SetMSG("客户端已经连接,客户端信息:" + _tmpdtuclient.DTUTCPClient.Client.RemoteEndPoint.ToString());
int i = 0;
Thread.Sleep(50);
if (_tmpdtuclient.DTUTCPClient == null)
break;
int _readBytesCount = -1;//收到的数据的字节长度
byte[] _receiveBuffer = new byte[512];//接收缓冲区
while (true)
{
try
{
if (i == 0)
{
//如果是第一包数据,则可以断定是发送的手机号等信息
_readBytesCount = _tmpdtuclient.DTUNetworkStream.Read(_receiveBuffer, 0, _receiveBuffer.Length);//如果客户端断开了连接,则read方法会立即返回0
if (_readBytesCount == 0)
{
//客户端退出连接。
SetMSG("客户端退出连接!客户端信息:" + _tmpdtuclient.DTUTCPClient.Client.RemoteEndPoint.ToString());
Thread.CurrentThread.Abort();
}
else
{
//
string _ReceiveDataStr = string.Empty;
_ReceiveDataStr = Encoding.Default.GetString(_receiveBuffer, 0, _readBytesCount);
}
i++;
}//发送的手机号等DTU身份信息
else
{
//下位机响应上位机命令执行后回传的数据,这里是接收
if (_readBytesCount == 0)
{
//客户端退出连接。
SetMSG("客户端退出连接!客户端信息:" + _tmpdtuclient.DTUTCPClient.Client.RemoteEndPoint.ToString());
Thread.CurrentThread.Abort();
}
else
{
SetMSG("收到:" + NomalFunction.ByteArrayToHexString(_receiveBuffer, _readBytesCount)+" ("+Encoding.Default.GetString(_receiveBuffer,0,_readBytesCount)+" ) 收到字节数:" + _readBytesCount.ToString());
}
}
Thread.Sleep(50);
}
catch (ThreadAbortException thae)
{
dtuClientList.Remove(_tmpdtuclient);
_tmpdtuclient.Close();
SetMSG("现在还有" + dtuClientList.Count.ToString() + "个连接。");
break;
}
catch (Exception ex)
{
SetMSG("读取客户端发送的数据时出错!详细信息:" + ex.Message);
dtuClientList.Remove(_tmpdtuclient);
_tmpdtuclient.Close();
SetMSG("现在还有" + dtuClientList.Count.ToString() + "个连接。");
break;
}
Thread.Sleep(5000);
}
_tmpdtuclient.Close();
}
//初始化TcpListener
//启动一个新的线程,假定该线程的目标函数是ThreadATargetFun(object _TcpListener)
//线程启动的时候要把TCPListener传递到目标函数中。
//在该函数中:
//先把object强制转换成TCPListener
_TcpListener.Start()
while(true)
{
TcpClient ClientTCPClient = _TCPListen.AcceptTcpClient();
Thread ReadClientConnectThread = new Thread(new ParameterizedThreadStart(ReadClientDataThreadFun)); //ReadClientDataThreadFun(object ClientTCPClient)
ReadClientConnectThread.Start(_tmpdtuclient);//传递该客户端
}
/// <summary>
/// 接收客户端发送的数据的线程的目标函数
/// </summary>
protected void ReadClientDataThreadFun(object obj)
{
//要增加自己的try、catch模块,判断是否客户端断开连接,或者网络中断等故障
//
//强制转换成TCPClient,获取网络流
while(true)
{
int _readBytesCount = -1;
byte[] _receiveBuffer = new byte[512];
_readBytesCount = _tmpdtuclient.DTUNetworkStream.Read(_receiveBuffer, 0, _receiveBuffer.Length);//如果客户端断开了连接,则read方法会立即返回0
if (_readBytesCount == 0)
{
//客户端退出连接。
SetMSG("客户端退出连接!客户端信息:" + _tmpdtuclient.DTUTCPClient.Client.RemoteEndPoint.ToString());
Thread.CurrentThread.Abort();
}
//读写网络流
}
}