zoukankan      html  css  js  c++  java
  • TCP断开重连

         在TCP协议中,对于断开的一方其本地用来通讯的端口(系统分配的)仍然会被保留一段时间。所以客户端断开后立即再连就是失败。解决的途径就是换一个本地的通讯端口,由于不能手动指定一个新端口那就只能重新创建TcpClient实例。

    在重新创建TcpClient之前要释放掉原TcpClient所占有的资源。

       C#代码:

        

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace OnLineVideo.Util
    {
        public class SocketClient
        {
    
            private TcpClient client;
            private bool isConnection=false;
            private string hostip;//TCP服务器
            private int port;//端口
            //检查网络状态线程
            Thread checkStateThread;
            
            public SocketClient(string hostip, int port)
            {
                this.hostip = hostip;
                this.port = port;
    
                client = new TcpClient();
                try
                {
                    client.Connect(hostip, port);
                }
                catch
                {
                    IsConnection = false;
                }
                checkStateThread = new Thread(new ThreadStart(checkState));
                checkStateThread.IsBackground = true;
                checkStateThread.Start();
            }
            /// <summary>
            /// 获取或者设置网络连接状态
            /// </summary>
            public bool IsConnection
            {
                get { return isConnection;}
                set { isConnection = value; }
            }
            private void checkState()
            {
                while (true)
                {
                    Thread.Sleep(1000);
                    if (client.Connected== false)
                    {
                        try
                        {
                            client.Close();
                            client = new TcpClient();
                            client.Connect(hostip, port);
                            IsConnection = true;
                        }
                        catch
                        {
                            IsConnection = false;
                        }
                    }
    
                }
            }
            public void SendCommand(string strMessage)
            {
                try
                {
                    byte[] bytesArray = Encoding.ASCII.GetBytes(strMessage+"\n");
                    NetworkStream networkStream = client.GetStream();
                    networkStream.Write(bytesArray,0,bytesArray.Length);
                }catch
                {
                    IsConnection = false;
                }
            }
            public void Close()
            {
                client.Close();
            }  
        }
    }

     

  • 相关阅读:
    喜欢的诗
    诗集与集诗
    oracle 12c 中asm元数据是否有所变化
    hdu2066一个人的旅行(dijkstra)
    单链表
    ExtJS4.2学习(7)——基础知识之Reader&Writer篇
    hdu3790最短路径问题 (用优先队列实现的)
    poj 1220 NUMBER BASE CONVERSION(短除法进制转换)
    POJ 4003 Bob’s Race && HDU4123 Bob’s Race (dfs+rmq)
    全排列
  • 原文地址:https://www.cnblogs.com/WilliamJiang/p/2459599.html
Copyright © 2011-2022 走看看