zoukankan      html  css  js  c++  java
  • SocketTcpClient

      1     public class SocketTcpClient
      2     {
      3         public static string ErrorMsg = string.Empty;
      4         private static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      5         private static string _serverIp = string.Empty;
      6         private static int _port = 2020;
      7         private static int _state = 0;
      8         private static readonly int _timeout = 10;
      9 
     10         private static void ClearSocket()
     11         {
     12             if (_socket != null)
     13             {
     14                 _socket.Close();
     15             }
     16             _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     17         }
     18 
     19         private static bool Connect()
     20         {
     21             try
     22             {
     23                 if (!_socket.Connected)
     24                 {
     25                     IPEndPoint ep = new IPEndPoint(IPAddress.Parse(_serverIp), _port);
     26                     _socket.Connect(ep);
     27                     Thread.Sleep(10);
     28                 }
     29                 return true;
     30 
     31             }
     32             catch (System.Exception ex)
     33             {
     34                 ClearSocket();
     35                 ErrorMsg = "网络错误!原因:" + ex.Message;
     36                 return false;
     37             }
     38         }
     39 
     40         private static bool Send(byte[] byteArray)
     41         {
     42             bool bConnect = _socket.Connected;
     43             if (!bConnect)
     44                 bConnect = Connect();
     45 
     46             if (bConnect)
     47             {
     48                 try
     49                 {
     50                     var numberOfBytesSent = _socket.Send(byteArray);
     51                     if (numberOfBytesSent == 0)
     52                     {
     53                         ClearSocket();
     54                         ErrorMsg = "网络错误!原因:发送时对方关闭socket连接";
     55                         return false;
     56                     }
     57                     return true;
     58                 }
     59                 catch (System.Exception ex)
     60                 {
     61                     ClearSocket();
     62                     ErrorMsg = "网络错误!原因:" + ex.Message;
     63                     return false;
     64                 }
     65             }
     66             return false;
     67         }
     68 
     69         private static bool Receive(ref byte[] byteArray)
     70         {
     71             bool bConnect = _socket.Connected;
     72             if (!bConnect)
     73                 bConnect = Connect();
     74 
     75             if (bConnect)
     76             {
     77                 MemoryStream ms = new MemoryStream();
     78                 byte[] readBuffer = new byte[1024*8];
     79 
     80                 do
     81                 {
     82                     var numberOfBytesRead = 0;
     83                     try
     84                     {
     85                         numberOfBytesRead = _socket.Receive(readBuffer);
     86                     }
     87                     catch (System.Exception ex)
     88                     {
     89                         ClearSocket();
     90                         ErrorMsg = "网络错误!原因:" + ex.Message;
     91                         return false;
     92                     }
     93 
     94                     //对方关闭socket连接,上面的Read函数据阻塞取消,收到数据为0
     95                     if (numberOfBytesRead == 0)
     96                     {
     97                         ClearSocket();
     98                         ErrorMsg = "网络错误!原因:接收时对方关闭socket连接";
     99                         return false;
    100                     }
    101 
    102                     //增加接收到的数据,并转化为MemoryStream
    103                     ms.Write(readBuffer, 0, numberOfBytesRead);
    104 
    105                 } while (_socket.Connected && _socket.Available > 0);
    106 
    107                 byteArray = ms.ToArray();
    108                 return true;
    109             }
    110             return false;
    111         }
    112 
    113         private static void RunWorkThread(object stateInfo)
    114         {
    115             DateTime dt = (DateTime) stateInfo;
    116             while (true)
    117             {
    118                 Thread.Sleep(100);
    119                 TimeSpan ts = DateTime.Now - dt;
    120                 if (_state == 1)
    121                 {
    122                     if (ts.Seconds > _timeout)
    123                     {
    124                         ClearSocket();
    125                         _state = 2;
    126                         break;
    127                     }
    128                 }
    129                 else
    130                 {
    131                     break;
    132                 }
    133             }
    134         }
    135 
    136         private static bool SysCall(byte[] dataRequest, ref byte[] dataResponse)
    137         {
    138             _state = 1;
    139             ThreadPool.QueueUserWorkItem(RunWorkThread, DateTime.Now);
    140 
    141             bool bResult = false;
    142             if (Send(dataRequest))
    143             {
    144                 bResult = Receive(ref dataResponse);
    145             }
    146 
    147             if (_state == 2)
    148             {
    149                 ErrorMsg = "超时错误!";
    150             }
    151             else
    152             {
    153                 _state = 0;
    154             }
    155             return bResult;
    156         }
    157 
    158         /// <summary>
    159         /// 同步传输
    160         /// </summary>
    161         /// <param name="controller"></param>
    162         /// <param name="action"></param>
    163         /// <param name="msg">utf-8</param>
    164         /// <returns></returns>
    165         public static string SyncCallMessage(string controller, string action, string msg)
    166         {
    167             byte[] msgRequest = Encoding.UTF8.GetBytes(controller + " " + action + " " + msg + Environment.NewLine);
    168             byte[] result = null;
    169             string msgResult = null;
    170 
    171             //同步调用远程方法
    172             bool bSuccess = SysCall(msgRequest, ref result);
    173             if (bSuccess)
    174             {
    175                 msgResult = Encoding.UTF8.GetString(result);
    176             }
    177             return msgResult;
    178         }
    179 
    180         public static void SetServerIp(string serverIp, int port)
    181         {
    182             _serverIp = serverIp;
    183             _port = port;
    184             ClearSocket();
    185         }
    186     }
     1     public static class JsonConvert
     2     {
     3         public static string ToJsonEx(this object dto)
     4         {
     5             return Newtonsoft.Json.JsonConvert.SerializeObject(dto);
     6         }
     7 
     8         public static T FromJsonEx<T>(this string json)
     9         {
    10             return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
    11         }
    12     }

     主要用在Pda开发数据通信方式,当然在Pda上用webrequest,拿到json解析也可以,以上Socket请求服务是同步的,如果需要稍微改善下,异步接收数据,那么服务器可以做到推送消息。

  • 相关阅读:
    octotree神器 For Github and GitLab 火狐插件
    实用篇如何使用github(本地、远程)满足基本需求
    PPA(Personal Package Archives)简介、兴起、使用
    Sourse Insight使用过程中的常使用功能简介
    Sourse Insight使用教程及常见的问题解决办法
    github 遇到Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts问题解决
    二叉查找树的C语言实现(一)
    初识内核链表
    container_of 和 offsetof 宏详解
    用双向链表实现一个栈
  • 原文地址:https://www.cnblogs.com/jonney-wang/p/5722410.html
Copyright © 2011-2022 走看看