zoukankan      html  css  js  c++  java
  • C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求

    2017.8.2 

    服务器:

      1 #region 参数与集合
      2         /// <summary>
      3         /// 客户端IP
      4         /// </summary>
      5         string clientIP;
      6         /// <summary>
      7         /// IP地址(IPAddress)
      8         /// </summary>
      9         string thisIp;
     10         /// <summary>
     11         /// 端口(Port)
     12         /// </summary>
     13         int port;
     14         /// <summary>
     15         /// Thread:监听客户端连接请求
     16         /// </summary>
     17         Thread watchClientThread = null;
     18         /// <summary>
     19         /// Socket:监听客户端连接请求
     20         /// </summary>
     21         Socket watchClientSocker = null;
     22         /// <summary>
     23         /// 套接字集合(Socket Gether)
     24         /// </summary>
     25         Dictionary<string, Socket> dictSocket = new Dictionary<string, Socket>();
     26         /// <summary>
     27         /// 线程集合(Thread Gether)
     28         /// </summary>
     29         Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>(); 
     30         #endregion
     31 
     32         #region 获取本地IP地址
     33         /// <summary>
     34         /// 获取本地IP地址
     35         /// </summary>
     36         private void GetIPAddress()
     37         {
     38             NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces();
     39             if (nis.Length > 0)
     40             {
     41                 for (int i = 0; i < nis.Length; i++)
     42                 {
     43                     foreach (var item in nis[i].GetIPProperties().UnicastAddresses)
     44                     {
     45                         string s = item.Address.ToString();
     46                         string[] ss = s.Split('.');
     47                         if (ss.Length == 4)
     48                         {
     49                             if (ss[0].ToString() != "127" && ss[0].ToString() == "192")
     50                             {
     51                                 thisIp = s;
     52                                 break;
     53                             }
     54                         }
     55                     }
     56                 }
     57             }
     58         }
     59         #endregion
     60 
     61         #region 启动服务器
     62         /// <summary>
     63         /// 启动服务器
     64         /// </summary>
     65         public void SocketStart()
     66         {
     67             GetIPAddress();
     68             port = 8888;
     69             watchClientSocker = new Socket(AddressFamily.InterNetwork,
     70                 SocketType.Stream,
     71                 ProtocolType.Tcp);
     72             IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(thisIp), port);
     73             try
     74             {
     75                 watchClientSocker.Bind(endPoint);
     76             }
     77             catch (SocketException se)
     78             {
     79                 rtbMonitoring.Text += "异常:" + se.Message + "
    ";
     80                 return;
     81             }
     82             catch (Exception ex)
     83             {
     84                  rtbMonitoring.Text += "异常:" + ex.Message + "
    ";
     85             }
     86             watchClientSocker.Listen(50);
     87             watchClientThread = new Thread(WatchConnection);
     88             watchClientThread.IsBackground = true;
     89             watchClientThread.Start();
     90         }
     91         #endregion
     92 
     93         #region 开始监听客户端连接请求
     94         /// <summary>
     95         /// 开始监听客户端连接请求
     96         /// </summary>
     97         void WatchConnection()
     98         {
     99             while (true)
    100             {
    101                 Socket socketConn = watchClientSocker.Accept();
    102                 clientIP = socketConn.RemoteEndPoint.ToString();
    103                 dictSocket.Add(clientIP, socketConn);
    104                 Thread thr = new Thread(ReccptionData);
    105                 thr.IsBackground = true;
    106                 thr.Start(socketConn);
    107                 dictThread.Add(clientIP, thr);
    108                  rtbMonitoring.Text += clientIP + " 连接成功" + "
    "; 
    109             }
    110         }
    111         #endregion
    112 
    113         #region 客户端信息处理
    114         /// <summary>
    115         /// 客户端信息处理
    116         /// </summary>
    117         /// <param name="socketConn"></param>
    118         void ReccptionData(object socketConn)
    119         {
    120             Socket socketClient = socketConn as Socket;
    121             while (true)
    122             {
    123                 byte[] arrRec = new byte[1024 * 1024 * 6];
    124                 int length = -1;
    125                 try
    126                 {
    127                     length = socketClient.Receive(arrRec);
    128                 }
    129                 catch (SocketException se)
    130                 {
    131                      rtbMonitoring.Text += "异常:" + se.Message+"
    ";
    132                     dictSocket.Remove(socketClient.RemoteEndPoint.ToString());
    133                     dictThread.Remove(socketClient.RemoteEndPoint.ToString());
    134                     break;
    135                 }
    136                 if (arrRec[0] == 0)
    137                 {
    138                     clientIP = socketClient.RemoteEndPoint.ToString();
    139                     string strMsg = System.Text.Encoding.UTF8.GetString(arrRec, 1, length - 1);// 将接受到的字节数据转化成字符串;
    140                     ReturnData(strMsg);
    141                      rtbMonitoring.Text +=clientIP+""+ strMsg + "
    ";
    142                 }
    143                 if (arrRec[0] == 1)
    144                 {
    145                     if (!Directory.Exists("FileInfo"))
    146                     {
    147                         Directory.CreateDirectory("FileInfo");
    148                     }
    149                     if (!File.Exists(arrRec + ".txt"))
    150                     {
    151                         File.Create(arrRec + ".txt");
    152                     }
    153                     string fileSavePath = arrRec + " .txt";
    154                     using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
    155                     {
    156                         fs.Write(arrRec, 1, length - 1);
    157                          rtbMonitoring.Text += "文件保存成功:" + fileSavePath + "
    ";
    158 
    159                     }
    160                 }
    161             }
    162 
    163         }
    164         #endregion
    165 
    166         #region 返回请求数据
    167         /// <summary>
    168         /// 返回请求数据
    169         /// </summary>
    170         /// <param name="data"></param>
    171         void ReturnData(string data)
    172         {
    173             string connectSql = "server=.;database=Thread_SocketDB;uid=sa;pwd=sa;";
    174             string strMsg;
    175             UserInfo u = new UserInfo();
    176             GetSql getsql = new GetSql();
    177             List<UserInfo> us = new List<UserInfo>();
    178             string[] datas = data.Split('/');
    179             string operationType = "";
    180             string type = "";
    181             string userName = "";
    182             string pwd = "";
    183             if (datas.Length > 4)
    184             {
    185                 operationType = datas[1];
    186                 type = datas[2];
    187                 userName = datas[3];
    188                 pwd = datas[4];
    189             }
    190             switch (operationType)
    191             {
    192                 case "用户":
    193                     switch (type)
    194                     {
    195                         case "登录":
    196                             SqlConnection con = new SqlConnection(connectSql);
    197                             con.Open();
    198                             SqlCommand com = new SqlCommand(getsql.GetSelectAll(), con);
    199                             SqlDataReader dr = com.ExecuteReader();
    200                             while (dr.Read())
    201                             {
    202                                 u = new UserInfo();
    203                                 u.UserName = dr["UserName"].ToString();
    204                                 u.Pwd = dr["Pwd"].ToString();
    205                                 us.Add(u);
    206                             }
    207                             dr.Close();
    208                             con.Close();
    209                             strMsg = "正在验证登录信息...";
    210                             SendContent(strMsg);
    211                             List<UserInfo> loginInfo = us.FindAll((p) =>
    212                                 p.UserName == userName);
    213                             if (loginInfo.Count <= 0)
    214                             {
    215                                 strMsg = "对不起,你的账号不存在!";
    216                                 SendContent(strMsg);
    217 
    218                             }
    219                             else
    220                             {
    221                                 foreach (UserInfo userInfo in loginInfo)
    222                                 {
    223                                     u = userInfo;
    224                                 }
    225 
    226                                 if (pwd != u.Pwd)
    227                                 {
    228 
    229                                     strMsg = "对不起,你的密码不正确!";
    230                                     SendContent(strMsg);
    231 
    232                                 }
    233                                 else
    234                                 {
    235                                     strMsg = "登录成功!";
    236                                     SendContent(strMsg);
    237                                 }
    238                             }
    239                             break;
    240                         case "编号查询":
    241 
    242                             break;
    243                     }
    244                     break;
    245                 case "管理员":
    246 
    247                     break;
    248             }
    249         }
    250         #endregion
    251 
    252         #region 封装发送信息
    253         /// <summary>
    254         /// 封装发送信息
    255         /// </summary>
    256         /// <param name="strMsg"></param>
    257         private void SendContent(string s)
    258         {
    259             byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(s);
    260             byte[] arrSendMsg = new byte[arrMsg.Length + 1];
    261             arrSendMsg[0] = 0; // 用来表示发送的是消息数据 
    262             Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);
    263             dictSocket[clientIP].Send(arrSendMsg);
    264         }
    265         #endregion
    View Code

    客户端:

      1  /// <summary>
      2         /// 客户端套接字对象
      3         /// </summary>
      4         Socket sockClient = null;
      5         /// <summary>
      6         /// 客户端线程
      7         /// </summary>
      8         Thread threadCilent = null;
      9         #region 开始连接字符串
     10         /// <summary>
     11         /// 开始连接字符串
     12         /// </summary>
     13         public void ServerConnect()
     14         {
     15             try
     16             {
     17                 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.4.186"), 8888);
     18                 sockClient = new Socket(AddressFamily.InterNetwork,
     19                     SocketType.Stream,
     20                     ProtocolType.Tcp);
     21                 try
     22                 {
     23                     lbReception.Text = "正在与服务器进行连接...
    ";
     24                     sockClient.Connect(endPoint);
     25                 }
     26                 catch (SocketException se)
     27                 {
     28                     lbReception.Text = "异常:" + se.Message + "
    ";
     29                     return;
     30                 }
     31                 lbReception.Text = "连接成功!";
     32                 threadCilent = new Thread(Res);
     33                 threadCilent.IsBackground = true;
     34                 threadCilent.Start();
     35 
     36             }
     37             catch (Exception)
     38             {
     39                 lbReception.Text = "IP无效!";
     40                 throw;
     41             }
     42 
     43 
     44         }
     45 
     46         #region 接收数据处理
     47         /// <summary>
     48         /// 接收数据处理
     49         /// </summary>
     50         private void Res()
     51         {
     52 
     53             while (true)
     54             {
     55                 // 定义一个2M的缓存区; 
     56                 byte[] arrMsgRec = new byte[1024 * 1024 * 6];
     57                 // 将接受到的数据存入到输入 arrMsgRec中; 
     58                 int length = -1;
     59                 try
     60                 {
     61                     length = sockClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; 
     62                 }
     63                 catch (SocketException se)
     64                 {
     65                     lbReception.Text = "异常;" + se.Message;
     66                     return;
     67                 }
     68                 catch (Exception e)
     69                 {
     70                     lbReception.Text = "异常:" + e.Message;
     71                     return;
     72                 }
     73                 if (arrMsgRec[0] == 0) // 表示接收到的是消息数据; 
     74                 {
     75                     string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);// 将接受到的字节数据转化成字符串; 
     76                     lbReception.Text = strMsg;
     77                 }
     78             }
     79         } 
     80         #endregion
     81         #endregion
     82 
     83         #region 发送数据
     84         /// <summary>
     85         /// 发送数据
     86         /// </summary>
     87         /// <param name="s"></param>
     88         public void send(string s)
     89         {
     90             try
     91             {
     92                 byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(s);
     93                 byte[] arrSendMsg = new byte[arrMsg.Length + 1];
     94                 arrSendMsg[0] = 0; // 用来表示发送的是消息数据 
     95                 Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);
     96                 sockClient.Send(arrSendMsg); // 发送消息; 
     97             }
     98             catch (Exception)
     99             {
    100 
    101                 throw;
    102             }
    103 
    104         } 
    105         #endregion
    View Code
  • 相关阅读:
    PHP-表单提交(form)
    JavaWeb-tomcat安装(Unsupported major.minor version 51.0/startup.bat闪退)
    答疑解惑
    IT路上可能遇到的小需求资源汇总
    批量定时任务将rtf文件转为docx,入参是rtf文件夹,生成一个docx文件夹
    Elastic Search快速入门
    https原理和如何配置https
    开源Futter项目
    如何触发react input change事件
    sqlserver 之 将查询结果变为json字符串
  • 原文地址:https://www.cnblogs.com/Anjjie/p/7274535.html
Copyright © 2011-2022 走看看