我有一个基于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应用程序中的套接字吗?我怀疑它可能是那里的东西,但我们不知道它是怎么样的... –