111,111
社区成员




ThreadStart myThreadStartDelegate = new ThreadStart(Listensing);
//创建一个用于监听的线程对象,通过代理执行线程中的方法
myThread = new Thread(myThreadStartDelegate);
//启动线程
myThread.Start();
private void Listensing()
{
Socket socket = null;
//获取本机上第一个可用的IP地址
myIPAddress = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);
Random r = new Random();
while (true)
{
try
{
//随机产生一个0~65535之间的端口号
myPort = r.Next(65535);
//myPort = 8888;
//创建TcpListener对象,在本机的IP和Port端口监听连接到该IP和端口的请求
tcpListener = new TcpListener(myIPAddress, myPort);
//开始监听,如果不出现异常,则说明IP地址和端口号可用
tcpListener.Start();
//显示IP地址和端口
ShowLocalIPAndPort();
//在信息窗口显示成功信息
ShowMyMessage(string.Format("尝试用端口{0}监听成功", myPort));
ShowMyMessage(string.Format("<message>[{0}]{1:h点m分s秒}开始在端口{2}监听与本机的连接", myIPAddress, DateTime.Now, myPort));
break;
}
catch
{
//继续while循环,以便随机找下一个可用端口号,同时显示失败信息
ShowMyMessage(string.Format("尝试用端口{0}监听失败", myPort));
}
}
while (true)
{
try
{
//使用阻塞方式接受客户端连接,根据连接信息创建Tcpclient对象
//注意:AcceptSocket接受到新的连接请求才会继续执行其后的语句
socket = tcpListener.AcceptSocket();
//如果往下执行,说明已经根据客户端连接请求创建了套接字
//使用创建的套接字接受客户端发送的信息
NetworkStream stream = new NetworkStream(socket);
StreamReader sr = new StreamReader(stream);
string recieveMessage = sr.ReadLine();
int i1 = recieveMessage.IndexOf(",");
int i2 = recieveMessage.IndexOf(",", i1 + 1);
int i3 = recieveMessage.IndexOf(",", i2 + 1);
string ipString = recieveMessage.Substring(0, i1);
string portString = recieveMessage.Substring(i1 + 1, i2 - i1 - 1);
string messageTypeString = recieveMessage.Substring(i2 + 1, i3 - i2 - 1);
string messageString = recieveMessage.Substring(i3 + 1);
ShowMyMessage(ipString, portString, messageTypeString, messageString);
}
catch
{
//通过停止TcpListener使AcceptSocket方法出现异常
//在异常处理中关闭套接字并终止线程
if (socket != null)
{
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Receive);
}
socket.Close();
}
myThread.Abort();
}
}
}