TcpServer.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Windows.Forms;
  10. using UAS_MES_NEW.Query;
  11. namespace UAS_MES_NEW.PublicMethod
  12. {
  13. public class TcpServer
  14. {
  15. //端口号
  16. private int SocketServerPort = 8800;
  17. //处理连接请求的线程
  18. private Thread acceptConnectReqThd;
  19. List<Socket> socket = new List<Socket>();
  20. Socket socketWatch;
  21. bool Watching;
  22. RichTextBox OperatResult;
  23. DataGridView dgv;
  24. public bool Start()
  25. {
  26. try
  27. {
  28. //创建一个socket对象
  29. socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  30. //获取IP
  31. IPAddress ip = IPAddress.Any;
  32. //创建端口号
  33. IPEndPoint port = new IPEndPoint(ip, SocketServerPort);
  34. //监听
  35. socketWatch.Bind(port);
  36. Console.WriteLine("监听成功");
  37. socketWatch.Listen(200); //设定最大的挂起长度
  38. //新建线程来处理连接请求
  39. acceptConnectReqThd = new Thread(AcceptConnectReqHandler);
  40. acceptConnectReqThd.IsBackground = true;
  41. acceptConnectReqThd.Start(socketWatch); //把socket对象当做参数传递给到线程里面的方法
  42. foreach (Form openForm in Application.OpenForms)
  43. {
  44. if (openForm is Query_SOP)
  45. {
  46. form = openForm;
  47. }
  48. }
  49. OperatResult = (RichTextBox)form.Controls["OperatResult"];
  50. dgv = (DataGridView)form.Controls["SendDGV"];
  51. return true;
  52. }
  53. catch (Exception)
  54. {
  55. return false;
  56. }
  57. }
  58. private void AcceptConnectReqHandler(object _socket)
  59. {
  60. try
  61. {
  62. //服务端的socket对象
  63. Socket serverSocket = (Socket)_socket;
  64. Watching = true;
  65. while (Watching)
  66. {
  67. //获取客户端socket。Accept方法处理任何传入的连接请求,并返回可用于与远程主机通信数据的Socket对象,即客户端的socket。
  68. //这一句话会卡主线程。只要没有新的链接进来,就会一直卡主不动(等待中)。
  69. //收到连接事件后,会往下执行,通过while又回到这里继续等待
  70. Socket clientSocket = serverSocket.Accept();
  71. socket.Add(clientSocket);
  72. //创建接受客户端消息的线程
  73. Thread acceptMsgReqThd = new Thread(ReciveMsgReqHandler);
  74. acceptMsgReqThd.IsBackground = true;
  75. acceptMsgReqThd.Start(clientSocket);
  76. }
  77. }
  78. catch (Exception e)
  79. {
  80. Console.WriteLine("服务端处理连接事件异常:" + e.ToString());
  81. }
  82. }
  83. Form form = null;
  84. private void ReciveMsgReqHandler(object _socket)
  85. {
  86. Socket clientSocket = (Socket)_socket;
  87. try
  88. {
  89. while (true)
  90. {
  91. //客户端连接成功后,接受来自客户端的消息
  92. if (clientSocket == null)
  93. {
  94. continue;
  95. }
  96. byte[] buffer = new byte[1024]; //数据缓冲区。
  97. //实际接收到的有效字节数
  98. //Receive也是个卡线程的方法
  99. //Console.WriteLine("等待接受客户端的数据:");
  100. //OperatResult.AppendText("等待接受客户端的数据,"+ clientSocket+ "\n");
  101. Console.WriteLine("等待接受客户端的数:");
  102. int dataLength = clientSocket.Receive(buffer);
  103. Console.WriteLine("接受到客户端的数据,字节数:" + dataLength);
  104. //OperatResult.AppendText("接受到客户端的数据,字节数:" + dataLength);
  105. //如果客户端关闭,发送的数据就为空,就跳出循环
  106. if (dataLength == 0)
  107. {
  108. break;
  109. }
  110. //假设收到的是个字符串(先这么假定),转成字符串处理
  111. string strMsg = Encoding.UTF8.GetString(buffer, 0, dataLength);
  112. Console.WriteLine("接受到客户端的消息:" + strMsg);
  113. for (int i = 0; i < dgv.Rows.Count; i++)
  114. {
  115. if (dgv.Rows[i].Cells["fp_name"].Value.ToString().Replace(".jpg", "") == strMsg.Replace("成功", ""))
  116. {
  117. Console.WriteLine(dgv.Rows[i].Cells["fp_name"].Value.ToString().Replace(".jpg", "") + strMsg.Replace("成功", ""));
  118. dgv.Rows[i].Cells["issend"].Value = "发送成功";
  119. }
  120. }
  121. OperatResult.AppendText("接受到客户端的消息:" + strMsg);
  122. }
  123. //中止当前线程
  124. //Thread.CurrentThread.Abort();
  125. }
  126. catch (Exception e)
  127. {
  128. SocketException socketExp = e as SocketException;
  129. if (socketExp != null && socketExp.NativeErrorCode == 10054)
  130. {
  131. Console.WriteLine("socket客户端关闭:" + e.ToString());
  132. }
  133. else
  134. {
  135. Console.WriteLine("======接受消息异常:" + e.ToString());
  136. }
  137. //中止当前线程
  138. Thread.CurrentThread.Abort();
  139. }
  140. }
  141. public void Send(string Command)
  142. {
  143. try
  144. {
  145. Console.WriteLine(Command);
  146. foreach (Socket item in socket)
  147. {
  148. item.Send(Encoding.Default.GetBytes(Command));
  149. }
  150. }
  151. catch (Exception ex)
  152. {
  153. Console.WriteLine(ex.Message);
  154. }
  155. }
  156. public void Stop()
  157. {
  158. //acceptConnectReqThd.Interrupt();
  159. //acceptConnectReqThd.Abort();
  160. //foreach (Socket item in socket)
  161. //{
  162. // item.Disconnect(true);
  163. // item.Close();
  164. //}
  165. try
  166. {
  167. Watching = false;
  168. socketWatch.Close();
  169. socketWatch = null;
  170. socket.Clear();
  171. }
  172. catch (Exception ex)
  173. {
  174. Console.WriteLine(ex.Message + ex.StackTrace);
  175. }
  176. }
  177. }
  178. }