当前位置:   article > 正文

C#编写Socket服务器_c# socket

c# socket

1.Socket介绍

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 

2.Socket一般应用模式(服务器端和客户端)

3.Socket的通讯过程

4.Socket通信基本流程图:

5.项目界面设计

6.实现核心代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Net;
  11. using System.Net.Sockets;
  12. namespace TCPProgect
  13. {
  14. public partial class FrmServer : Form
  15. {
  16. public FrmServer()
  17. {
  18. InitializeComponent();
  19. }
  20. //第一步:调用socket()函数创建一个用于通信的套接字
  21. private Socket listenSocket;
  22. //字典集合:存储IP和Socket的集合
  23. private Dictionary<string, Socket> OnLineList = new Dictionary<string, Socket>();
  24. //当前时间
  25. private string CurrentTime
  26. {
  27. get { return DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine; }
  28. }
  29. //编码格式
  30. Encoding econding = Encoding.Default;
  31. private void btn_StartService_Click(object sender, EventArgs e)
  32. {
  33. //第一步:调用socket()函数创建一个用于通信的套接字
  34. listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  35. //第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用Bind()函数来实现
  36. IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(this.txt_IP.Text.Trim()), int.Parse(this.txt_Port.Text.Trim()));
  37. try
  38. {
  39. listenSocket.Bind(endPoint);
  40. }
  41. catch (Exception ex)
  42. {
  43. MessageBox.Show("服务器开启失败:" + ex.Message, "开启服务器");
  44. return;
  45. }
  46. //第三步:调用listen()函数使套接字成为一个监听套接字
  47. listenSocket.Listen(10);
  48. ShowMessage("服务器开启成功");
  49. //开启一个线程监听
  50. Task.Run(new Action(() =>
  51. {
  52. ListenConnection();
  53. }
  54. ));
  55. this.btn_StartService.Enabled = false;
  56. }
  57. private void ListenConnection()
  58. {
  59. while (true)
  60. {
  61. Socket clientSocket = listenSocket.Accept();
  62. string ip = clientSocket.RemoteEndPoint.ToString();
  63. //更新在线列表
  64. AddOnLine(ip, true);
  65. //更新在线列表集合
  66. OnLineList.Add(ip, clientSocket);
  67. ShowMessage(ip + "上线了");
  68. Task.Run(() => ReceiveMsg(clientSocket));
  69. }
  70. }
  71. /// <summary>
  72. /// 接收方法
  73. /// </summary>
  74. /// <param name="clientSocket"></param>
  75. private void ReceiveMsg(Socket clientSocket)
  76. {
  77. while (true)
  78. {
  79. //定义一个2M的缓冲区
  80. byte[] buffer = new byte[1024 * 1024 * 2];
  81. int length = -1;
  82. try
  83. {
  84. length = clientSocket.Receive(buffer);
  85. }
  86. catch (Exception)
  87. {
  88. //客户端下线了
  89. //更新在线列表
  90. string ip = clientSocket.RemoteEndPoint.ToString();
  91. AddOnLine(ip, false);
  92. OnLineList.Remove(ip);
  93. break;
  94. }
  95. if (length == 0)
  96. {
  97. //客户端下线了
  98. //更新在线列表
  99. string ip = clientSocket.RemoteEndPoint.ToString();
  100. AddOnLine(ip, false);
  101. OnLineList.Remove(ip);
  102. break;
  103. }
  104. if (length > 0)
  105. {
  106. string info = econding.GetString(buffer, 0, length);
  107. ShowMessage(info);
  108. }
  109. }
  110. }
  111. /// <summary>
  112. /// 在线列表更新
  113. /// </summary>
  114. /// <param name="clientIp"></param>
  115. /// <param name="value"></param>
  116. private void AddOnLine(string clientIp, bool value)
  117. {
  118. Invoke(new Action(() =>
  119. {
  120. if (value)
  121. {
  122. this.lst_Online.Items.Add(clientIp);
  123. }
  124. else
  125. {
  126. this.lst_Online.Items.Remove(clientIp);
  127. }
  128. }));
  129. }
  130. /// <summary>
  131. /// 更新接收区
  132. /// </summary>
  133. /// <param name="info"></param>
  134. private void ShowMessage(string info)
  135. {
  136. Invoke(new Action(() =>
  137. {
  138. this.txt_Rcv.AppendText(CurrentTime + info + Environment.NewLine);
  139. }));
  140. }
  141. /// <summary>
  142. /// 消息发送
  143. /// </summary>
  144. /// <param name="sender"></param>
  145. /// <param name="e"></param>
  146. private void btn_Send_Click(object sender, EventArgs e)
  147. {
  148. if (this.lst_Online.SelectedItem != null)
  149. {
  150. foreach (string item in this.lst_Online.SelectedItems)
  151. {
  152. if (OnLineList.ContainsKey(item))
  153. {
  154. OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));
  155. }
  156. }
  157. }
  158. else
  159. {
  160. MessageBox.Show("请先选择要发送的对象", "发送消息");
  161. }
  162. }
  163. /// <summary>
  164. /// 群发功能
  165. /// </summary>
  166. /// <param name="sender"></param>
  167. /// <param name="e"></param>
  168. private void btn_SendAll_Click(object sender, EventArgs e)
  169. {
  170. foreach (string item in this.lst_Online.Items)
  171. {
  172. if (OnLineList.ContainsKey(item))
  173. {
  174. OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));
  175. }
  176. }
  177. }
  178. }
  179. }

7.运行效果

        7.1 运行界面演示

         7.2 接收消息界面演示

         7.3 发送消息界面演示

         7.4 群发消息演示

源码地址:https://download.csdn.net/download/m0_73500215/89143273

如果你觉得我的分享有价值,那就请为我点赞收藏吧!你们的支持是我继续分享的动力。希望大家能够积极评论,让我知道你们的想法和建议。谢谢!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/973285
推荐阅读
  

闽ICP备14008679号