我有一個基於TcpListener的簡單TCP服務器。因爲我想在Windows窗體應用程序使用它我把它在一個單獨的線程中運行,如下所示:C#TcpListener AcceptSocket不能在單獨的線程中工作
public void Start() {
this.serverThread = new Thread(new ThreadStart(this.ThreadProcess));
this.serverThread.Name = "Tcp-Server";
this.serverThread.Start();
}
protected void ThreadProcess() {
try
{
IPAddress ipAd = IPAddress.Parse("169.254.42.86");
this.listener = new TcpListener(ipAd, this.port);
this.listener.Start();
Socket mySocket = this.listener.AcceptSocket();
while (true)
{
if (mySocket.Connected)
{
byte[] RecvBytes = new byte[8192];
int byteNo = mySocket.Receive(RecvBytes, RecvBytes.Length, 0);
ASCIIEncoding asen = new ASCIIEncoding();
mySocket.Send(asen.GetBytes("srv reply msg"));
}
else
{
WriteLine("socket not connected.");
}
}
}
finally {
StopListener();
}
}
如果我使用這臺服務器的控制檯應用程序爲:
static void Main(string[] args)
{
try
{
int port = 8001;
Server server = new Server(port);
server.Start();
while (true) {
//server is running in separate thread
}
...
一切正常預期。但是,當我嘗試將它包含在單擊按鈕時啓動服務器的Windows窗體應用程序中時,代碼不再工作。服務器線程正在啓動,但它不接受任何套接字。 有什麼,我失蹤?我一直在谷歌搜索高低無結果... 感謝您的任何幫助!
我沒有看到任何原因爲什麼代碼不應該在Windows窗體應用程序中工作。問題似乎在別的地方。 – Tilak
可能發生異常並調用StopListener。這是一個TCP連接,客戶端斷開連接不正常會導致異常,您應該嘗試在循環中補償該錯誤 – TimothyP
您可以發佈確切的方法來啓動WinForms應用程序中的套接字嗎?我懷疑它可能是那裏的東西,但我們不知道它是怎麼樣的... –