😍全网最细-保姆级教程😍那就不多说了开始✨
负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket 但是一个语句只能建立一次链接 并且他是主线程在执行 一旦执行起来没人连窗口就会假死 所以说我们得把后边这一句话开新线程 并放到一个循环里 Socket socketSend = socketWatch.Accept(); 在循环里还有一个难题: 在方法找不到socketWatch 我们需要把他当作一个参数传进来 但是我们要开辟新线程 被线程执行的函数 如果要传参就必须传Object类型的参数 我们可以传完参数我们再把它强转回来就可以了
源码展示:
private void button1_Click(object sender, EventArgs e)
{
//创建一个负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//创建IP地址和端口号对象
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
//让负责监听的socket绑定IP地址和端口号
socketWatch.Bind(point);
ShowMsg("监听成功");
//设置监听队列 就是在某一时间点能够连入客户端最大的数量 到达这个限度就要排队了
socketWatch.Listen(10);
//负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket
//但是一个语句只能建立一次链接 并且他是主线程在执行 一旦执行起来没人连窗口就会假死
//所以说我们得把后边这一句话开新线程 并放到一个循环里 Socket socketSend = socketWatch.Accept();
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);
}
/// <summary>
/// 等待客户端的连接 并且创建与之通信的socket
/// </summary>
void Listen(object o) {
//负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket
//但是在方法找不到socketWatch 把他当作一个参数传进来
//但是我们要开辟新线程 被线程执行的函数 如果要传参就必须传Object类型的参数
//传完参数我们再把它强转回来就可以了
Socket socketWatch = o as Socket;
//as 类型转换 转换成功返回对象 转换不成功一个null
while (true)
{
Socket socketSend = socketWatch.Accept();
ShowMsg(socketSend.RemoteEndPoint.ToString() + "链接成功");
}
}
void ShowMsg(string str) {
txtLog.AppendText(str+"\r\n");
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
如果有写的不好的地方还请大家指正。