IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 2021-07-27 -> 正文阅读

[网络协议]2021-07-27

Socket通讯

TCP连接

进行Socket数据通信要通过几个必要的步骤,首先进行TCP端到端的连接确认,确认连接成功后,发送相关的指令让服务器给客户端(也就是我们的电脑)返回我们所需要的数据集,其中会包含一些我们并不需要的数据,所以需要进行筛查操作 将我们所需要的目标数据给挑选出来以便客户端进行使用,结束时调用Close()断开连接。

Connect()

建立TCP连接

 public bool Connect(string ipAddress, int port)
        {

            string ConnectString = "";
            bool bRet = false;
            try
            {
                if (_SK != null)
                {
                    if (_SK.Connected)
                    {
                        _SK.Close();
                    }
                    _SK = null;
                }
            }
            catch (Exception e)
            {
               //连接失败
            }
            try
            {
                _SK = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint tempRemoteIP = new IPEndPoint(IPAddress.Parse(ipAddress), port);
                EndPoint epTemp = (EndPoint)tempRemoteIP;
                _SK.Connect(epTemp);
                //ThrWinsockListen线程Start
                ThrWinsockListen = new Thread(new ThreadStart(ReceiveProc));        //创建Winsock监听线程
                ThrWinsockListen.IsBackground = true;      //后台线程
                ThrWinsockListen.Priority = ThreadPriority.AboveNormal;
                ThrWinsockListen.Start();
                //JESsendThrea线程Start
                sendThread = new Thread(new ThreadStart(SendDataProc));           //用线程进行指令的发送
                sendThread.Start();
                bRet = true;
                //socket连接成功      
            }
            catch (Exception e)
            {
                //Socket连接失败
                bRet = false;
            }
            return bRet;
        }

IsConnected()

判断TCP是否已经成功连接

        public bool IsConnected
        {
            get
            {
                if (this._SK != null) //this指代当前的客户端实例
                {
                    return this._SK.Connected;
                }
                else
                {
                    return false;
                }
            }
        }

SendDataProc()

向服务器发送数据

private void SendDataProc()
        {
            bool keepalive = true;                          //各个客户端Socket线程存活的标识   
            Socket childClient = _SK;                    //将新传入的客户对象赋给新的SOCKET
          
            int j = 0;
            while (keepalive)
            {
                try
                {
                    if (_SK == null || !_SK.Connected)
                    {
                        break;
                    }
                    if (QueryFlag)
                    {
                        string strbuffer = "GM,";
                        string sProID = "0,0";
                        strbuffer = strbuffer + sProID + "\r\n";
                        int len = strbuffer.Length;
                       
                        Byte[] byteSend = new byte[len];
                        byteSend = System.Text.Encoding.Default.GetBytes(strbuffer);
                        int lengh = 0;
                        lock (byteSend)
                        {
                            for (int i = 0; i < 5; i++)
                            {
                                lengh = childClient.Send(byteSend);
                                Thread.Sleep(1);
                            }
                        }
                   
                        if (lengh > 0)
                        {
                            JESQueryFlag = false;
                        }
                        else
                        {
                            SysLog.Info("发送数据失败");
                            break;
                        }
                    }
                    Thread.Sleep(1);
                }
                catch (SocketException se)
                {  
                }
            }
        }

ReceiveProc()

从服务器接收数据

private void ReceiveProc()
        {
            bool keepalive = true;                          //各个客户端Socket线程存活的标识   
            Socket childClient = _SK;                    //将新传入的客户对象赋给新的SOCKET
           //接收线程启动
            while (keepalive)
            {
                try
                {
                    if (_SK == null || !_SK.Connected)
                    {
                        break;
                    }
                    while (给一个控制是否开启接收的逻辑信号)
                    {
                        try
                        {
                            Byte[] byBuff1 = new Byte[1024]; //声明缓冲区大小
                            childClient.Receive(byBuff1, byBuff1.Length, SocketFlags.None);
                            if (_SK == null || !_SK.Connected)
                            {
                                break;
                            }
                            string strBuff = Encoding.Default.GetString(byBuff1).TrimEnd('\0');  //接收到客户端的数据
                            StringToDouble(strBuff);
                        }
                        catch (SocketException se)
                        {
                            SysLog.Error("Socket Error", se);
                        }
                    }
                    Thread.Sleep(1);
                }
                catch (SocketException se)
                {
                }
            }

            //接收线程退出
        }

StringToDouble()

将接收到的字符串数据转换为double类型

 public void StringToDouble(string strbuffer)
        {
            try
            {
                string[] strArr = strbuffer.Split(',');
                double[] doubleArr = new double[strArr.Length];
                
                for (int i = 0; i < strArr.Length; i++)
                 {
                     doubleArr[i] = Convert.ToDouble(strArr[i]);
                 }
             }

                List<System.Double> item = new List<System.Double>(doubleArr);
                AppStatus.array.Add(item);

            }
            catch(Exception ex)
            {
                SysLog.Error("Error in StringToDouble:" + ex.ToString());
            }
        }

Close()

关闭TCP连接

        public void Close()
        {
            try
            {
                if (_SK != null)
                {
                    if (_SK.Connected)
                    {
                        _SK.Shutdown(SocketShutdown.Both);
                        Thread.Sleep(20);
                        _SK.Close();
                    }
                    _SK = null;
                    if (ThrWinsockListen != null)
                    {
                        for (int i = 0; i < 20; i++)
                        {
                            bool b1 = ThrWinsockListen.Join(1);
                            if (b1)
                            {
                                break;
                            }
                        }

                        if (ThrWinsockListen.IsAlive)
                        {
                            ThrWinsockListen.Abort();
                        }
                    }
                    if (sendThread != null)
                    {
                        for (int i = 0; i < 20; i++)
                        {
                            bool b1 = sendThread.Join(1);
                            if (b1)
                            {
                                break;
                            }
                        }

                        if (sendThread.IsAlive)
                        {
                            sendThread.Abort();
                        }
                    }

                    ThrWinsockListen = null;
                    sendThread = null;
                }
            }
            catch (Exception e)
            {
                Socket线程退出
            }
            finally
            {
                _SK = null;
                ThrWinsockListen = null;
                sendThread = null;
            }
        }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 08:11:23  更:2021-07-28 08:12:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:31:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码