无法启动简单的TCP / IP客户端

时间:2016-07-10 17:09:40

标签: c# tcp

我试图打开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();

3 个答案:

答案 0 :(得分:0)

这是预期的行为。您的程序没有崩溃 - 调用AccpetTcpClient()阻止等待传入连接:

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx

您还需要从另一个线程打开到端口619的TCP连接,然后您的程序将继续运行。

答案 1 :(得分:0)

  

AcceptTcpClient是一种阻止方法

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient%28v=vs.110%29.aspx)。

当您调用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的情况下以这种方式进行轮询可能是过度的,即,您经常检查属性并浪费周期。

完成所有这些后,您需要找到一种以对您的应用程序有意义的方式处理客户端的方法。每个客户一键接受?在他们到达之前永远处理新连接,直到你取消听众?祝你好运

BackgroundWorker tutorial

AcceptTcpClientAsync MSDN