我试图打开TCP / IP侦听器但是当我运行下面的代码时,它会崩溃。它没有给我一个错误,因为当它崩溃时,它会冻结并停止响应。
TcpListener server = new TcpListener(IPAddress.Any, 619);
TcpClient client;
private void button3_Click(object sender, EventArgs e)
{
server.Start();
client = server.AcceptTcpClient();
if (client.Connected)
{
MessageBox.Show("connected");
}
}
我知道这个端口是免费的,所以不是这样。它在这条线上崩溃了:
client = server.acceptTcpClient();
答案 0 :(得分:0)
这是预期的行为。您的程序没有崩溃 - 调用AccpetTcpClient()
阻止等待传入连接:
您还需要从另一个线程打开到端口619的TCP连接,然后您的程序将继续运行。
答案 1 :(得分:0)
AcceptTcpClient是一种阻止方法
当您调用AcceptTcpClient时,它将等待直到建立连接。因为它等待主线程(运行GUI的位置),它看起来像程序被冻结。尝试使用AcceptTcpClientAsync或将接受部分放在不同的线程中。这应该可以解决你的问题。
Desirius
答案 2 :(得分:0)
您正在UI线程上执行阻止调用,这会产生"崩溃"应用
您需要使用另一个线程或异步执行操作。背景工作者可能是一个起点。
private BackgroundWorker bgw = new BackgroundWorker();
public MainWindow()
{
InitializeComponent();
bgw.DoWork += Bgw_DoWork;
bgw.RunWorkerCompleted += Bgw_RunWorkerCompleted;
bgw.WorkerSupportsCancellation = true;
}
private void button3_Click(object sender, EventArgs e)
{
if (!bgw.IsBusy)
{
bgw.RunWorkerAsync();
((Button)sender).Content = "Cancel";
}
else
{
bgw.CancelAsync();
}
}
private void Bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
button.Content = "Start";
}
private void Bgw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
var server = new TcpListener(IPAddress.Any, 619);
server.Start();
while (true)
{
if (worker.CancellationPending)
{
e.Cancel = true;
server.Stop();
break;
}
else
{
if (server.Pending())
{
var client = listener.AcceptTcpClient();
// handle client here or do something like below to return the client to the RunWorkerCompleted method in
// e.result
e.Result = client;
break;
}
}
}
}
还有其他选项,例如使用server.AcceptTcpClientAsync()而不是轮询server.Pending()属性。此外,在不使用Thread.Sleep的情况下以这种方式进行轮询可能是过度的,即,您经常检查属性并浪费周期。
完成所有这些后,您需要找到一种以对您的应用程序有意义的方式处理客户端的方法。每个客户一键接受?在他们到达之前永远处理新连接,直到你取消听众?祝你好运