【问题标题】:C# TCP client with backgroundWorker带有 backgroundWorker 的 C# TCP 客户端
【发布时间】:2013-04-26 15:57:06
【问题描述】:

我有一个用 C# 编写的 TCP 客户端,我使用 backgroundWorker 连接服务器,如下所示:

void ConnectToServer() {
    try {
        bwConnector = new BackgroundWorker();
        bwConnector.DoWork += new DoWorkEventHandler(bwConnector_DoWork);
        bwConnector.RunWorkerCompleted = new RunWorkerCompletedEventHandler(bwConnector_RunWorkerCompleted);
        bwConnector.RunWorkerAsync();
        e.Result = true;
    } catch {
        e.Result = false;
    }
}

void bwConnector_DoWork(object sender, DoWorkEventArgs e) {

    clientSocket = new Socket(xxxxxx);
    clientSocket.Connect(xxxx);

    this.networkStream = new NetworkStream(this.clientSocket);
    this.bwReceiver = new BackgroundWorker();
    this.bwReceiver.DoWork += new DoWorkEventHandler(StartReceive);
    ........
}

我有一个计时器来检查clientSocket.Connected 是真还是假,如果是假,我会再次调用ConnectToServer() 进行另一次连接尝试。

问题是每次我关闭应用程序并重新打开它时,似乎最后一个套接字仍然存在并且有 2 个具有相同 IP 但不同端口连接到服务器的套接字。

即使我有这样的东西:

void bwConnector_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {

    ((BackgroundWorker)sender).Dipose();
    if (!((bool)e.Result)) {
        Debug.Log("failed");
    } else {
        Debug.Log("success");
    }
}

对于断开连接,我有这样的代码:

System.Net.NetworkInformation.NetworkChange.NetworkAvailablilityChanged += new System.Net.NetworkInformation.NetworkAvailabilityChangedEventHandler(NetworkAvailabilityChanged);
private void NetworkChange_NetworkAvailabilityChanged(object sender , System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
    {
        if ( !e.IsAvailable )
        {
            this.OnNetworkDead(new EventArgs());
            this.OnDisconnectedFromServer(new EventArgs());
        }
        else
            this.OnNetworkAlived(new EventArgs());
    }
...............
public event DisconnectedEventHandler DisconnectedFromServer;
protected virtual void OnDisconnectedFromServer(EventArgs e)
{
    if ( DisconnectedFromServer != null )
    {
        DisconnectedFromServer(this , e);
    }
}
...........
void StartReceive(xxxxxxxxx) {
    while (this.clientSocket.Connected) {
        .........
    }
    this.Disconnect();
}

bool Disconnect() {
    if (this.clientSocket != null && this.clientSocket.Connected) {
        try {
            this.clientSocket.Shutdown(SocketShutdown.Both);
            this.clientSocket.Close();
            return true;
        } catch {
            return false;
        }
    }
}

感谢您的帮助。

【问题讨论】:

  • 你在哪里关闭连接?
  • 我在问题中添加了一些代码,谢谢
  • 如果我理解正确的话;你打开一个连接->准备好接受数据的套接字->开始接收数据->关闭连接。这一切都很好,并保持一切井井有条。问题似乎是由该计时器引起的,该计时器在关闭后立即打开连接。因此,就在您的应用程序即将退出之前,Timer 打开了一个永远不会关闭的连接。
  • 实际上我在正常情况下没有“关闭连接”,因为我不希望客户端主动断开与服务器的连接。如果服务器死机并重新打开,我只希望客户端再次连接到服务器。
  • 这很好理解,但是在退出应用程序之前,您需要注意最后一次关闭连接。禁用定时器->检查连接是否打开->如果打开关闭它->正常退出

标签: c# tcp backgroundworker


【解决方案1】:

按照 SO 的建议在此回复。

遗憾的是,现实世界的应用程序往往会失败,并且经常会发生意想不到的事情。被用户意外关闭可能是最明显的“意外”。如果不出意外,我会确保至少在退出时清理所有内容。

最终,一切由你决定。

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2012-05-24
    • 2011-11-12
    • 1970-01-01
    • 2011-08-08
    • 2020-12-07
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    相关资源
    最近更新 更多