Accept() 迴圈,建立新 Connection 執行緒處理會話。private void btn_startServer_Click(object sender, EventArgs e)
{
Thread createServer = new Thread(WaitForConnect);
createServer.Start();
}
private void WaitForConnect()
{
SocketListener listener = new SocketListener(Convert.ToInt32(txt_port.Text));
listener.StartListening();
}
偵聽迴圈為阻塞操作,必須在獨立執行緒執行,否則 UI 會凍結。
IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(localEndPoint);
listener.Listen(20); // 待連佇列長度
while (true)
{
Socket connection = listener.Accept(); // 阻塞等待新連線
Logger.Log("Connect", connection.RemoteEndPoint.ToString());
// 建立 Connection 物件與執行緒(見下篇)
}