【发布时间】:2012-12-26 04:17:38
【问题描述】:
我有一个基于 TcpListener 的简单 TCP 服务器。因为我想在 Windows 窗体应用程序中使用它,所以我让它在一个单独的线程中运行,如下所示:
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 窗体应用程序中运行的任何原因。问题似乎出在其他地方。
-
可能会发生异常并调用 StopListener。这是一个 TCP 连接,客户端断开不正确会导致异常,你应该在循环中尝试一下以弥补这一点
-
能否请您发布在 WinForms 应用程序中启动套接字的确切方法?我怀疑它可能在那里,但我们不知道它看起来如何......
标签: c# winforms multithreading tcplistener