刚用Socket不久,发现当服务器那边那关闭时,我的程序窗体就卡住了.
用了一个Timer控件,以每30秒就发送一次信息进行
如果服务器那边没有关闭和出现异常,程序非常正常
关闭或出异常时,就卡住了Timer的时间间隔30S
是Timer在计时而卡住了还是Socket的问题.
还请各位高手教我方法解决这个问题!

解决方案 »

  1.   

    是因为Socket卡住了,导致Timer停止,一般来就Socket应该在线程用,这样不会导致主线程停止。
      

  2.   

    我刚才写太快了
    Timer的计时没有停止,但窗体都完成卡住了。当计时计到30S时还会再发送数据,也就在发送数据后,窗体就不被卡住了
      

  3.   

    使用异步来解决.socket使用异步
      

  4.   

    卡住,肯定是你的程序在接受服务器的消息,处于一直接收的状态。
    把socket的操作写在子线程里,可以解决你的问题。
      

  5.   

    我把Socket的操作写到子线程里了,可还是会卡这30S
    public void ReceiveSocket()
            {
                while (true)
                {
    ....
                        try
                        {                        MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度
                        }
                        catch //(Exception e)
                        {
                           break;
                        }
    ....
                }
           }
    上面就是子线程里面的代码片断
    如何让他不卡呢?
      

  6.   

    这个应该是正常的把! 本来就是相互通信的东西, 应该用timer来测试服务器是否开启的, 关闭的话给个提示!
      

  7.   

    没错,我是用一个Timer来测试服务是否开启,如果服务器是开启的话,正常
    但是当服务器关闭时,这时进行测试,就开始卡了,卡的总时间是我每次测试的间隔时间
    程序窗体完全不能操作的那种卡。
      

  8.   

    又发现一个问题,当服务器断开后,可我这边还在一直接收,因为Socket还不知道服务器已经断开。
    如何才能让Socket知道服务器已经断开了?
      

  9.   

    你使用的应该是TCP的连接方式,这样的连接有即时性质,这样的连接无论哪边断都会“卡死”,所以在关闭时要先向对方传终止连接,不然可以改用UDP的连接方式。
      

  10.   

    public void ReceiveSocket() 
            { 
                while (true) 
                { 
    .... 
                       try 
                        {                         MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度 
                        } 
                        catch //(Exception e) 
                        { 
                          break; 
                        } 
    .... 
                } 
          } ----------------
    你给出的代码中可能在逻辑上有点问题,当服务器关闭的时候MsgLen 可能返回的是0而不会抛出错误,但因为你的代码里没有处理这个情况,可能程序一直在进行死循环了.你可以试着加一个判断,比如:if( MsgLen ==0)
    {
        return;
    }
      

  11.   

    hbxtlhx
    谢谢您
    我知道我错在哪里了!
    没有收到信息时MsgLen是没有数值的,当服务器关闭或异常时,MsgLen的值是为0.
    以前总是以为没有收到信息时MsgLen的值是为0的.现在明白自己错了
    代码更改后如下
    public void ReceiveSocket() 
            { 
                while (true) 
                { 
    .... 
                       try 
                        {                         MsgLen = CMSocket.Receive(PKHead, Marshal.SizeOf(PK_Head), SocketFlags.None);//阻塞接收,返回接收数据长度 
                        } 
                        catch //(Exception e) 
                        { 
                          break; 
                        } 
                    if(MsgLen!=0)
                    {
    .... 
                    }
                    else
                    {
    ....
                    }
                } 
          }