【问题标题】:C# Client-Server application problemC#客户端-服务器应用程序问题
【发布时间】:2010-01-15 20:29:32
【问题描述】:

我在网络上运行我的应用程序,在某些情况下客户端与服务器的连接断开。在此之后,当我想向服务器发送消息时,我收到以下错误:在未连接的套接字上不允许操作(类似这样)。

我想为对象类型 TcpClient 创建一个事件,并在 tcp_obj.Connected = false 时调用一个函数来停止执行当前代码。我怎么能这样做?

或者给我其他建议。

谢谢。

【问题讨论】:

    标签: c# connection client


    【解决方案1】:

    我至少从 Java 中的套接字编程中知道,当客户端失去与服务器的连接时,服务器不会也无法知道它。您需要某种心跳来检测早期断开连接。

    我们经常在我们的客户端/服务器应用程序中使用心跳来检测早期断开连接并将它们记录在服务器上。这样,服务器可以关闭关联的套接字并将连接释放回池。

    只需定期向客户端发送命令并等待响应。如果在超时时间内未获得响应,则假定断开连接并关闭流。

    【讨论】:

      【解决方案2】:

      在尝试发送消息之前,我会先检查您的连接对象以确保您已连接。还要确保您将发送逻辑放在 try-catch 中,这样如果您在传输过程中碰巧断开连接,您将能够继续恢复,而不会破坏您的应用程序。

      伪代码:

      private void SendMessage(string message, Socket socket)
      {
        if(socket.connectionState = States.Connected)
        {
            try{
              // Attempt to Send
            }
            catch(SocketException Ex)
            {
              // Disconenct, Additional Cleanup Etc.
            } 
      }
      }
      

      如果您使用 C#,则在连接状态更改之前,您将在连接状态更改之前触发套接字断开事件。确保在套接字连接后立即绑定此事件。

      【讨论】:

      • 如何创建 TCP 断开事件触发?可以举个例子吗?
      【解决方案3】:

      我们能知道你为什么使用 TCP 套接字吗?是为了调用一个tcp设备或者服务器代码吗?

      如果要调用 .net 服务器应用程序,我建议您使用 Windows Communication Foudation。通过net.tcp、http等方式暴露服务很简单。

      问候,

      【讨论】:

        【解决方案4】:

        其实这是个很老的问题了,

        如果我正确理解您的问题,您需要一种方法来了解您的应用程序是否仍连接到服务器,反之亦然。

        如果是这样,那么一种解决方法是使用 UDP 连接来检查连接(我知道开销,但它比轮询连接状态要好得多),您可以在发送数据之前进行检查。

        由于 UDP 不是面向连接的,因此您在发送数据时不需要连接

        【讨论】: