C#编写Socket服务器
创始人
2025-01-21 02:07:27
0

1.Socket介绍

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

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

3.Socket的通讯过程

4.Socket通信基本流程图:

5.项目界面设计

6.实现核心代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;  using System.Net; using System.Net.Sockets;  namespace TCPProgect {     public partial class FrmServer : Form     {         public FrmServer()         {             InitializeComponent();         }                  //第一步:调用socket()函数创建一个用于通信的套接字         private Socket listenSocket;          //字典集合:存储IP和Socket的集合         private Dictionary OnLineList = new Dictionary();          //当前时间         private string CurrentTime         {             get { return DateTime.Now.ToString("HH:mm:ss") + Environment.NewLine; }         }          //编码格式         Encoding econding = Encoding.Default;           private void btn_StartService_Click(object sender, EventArgs e)         {             //第一步:调用socket()函数创建一个用于通信的套接字             listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);              //第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用Bind()函数来实现             IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(this.txt_IP.Text.Trim()), int.Parse(this.txt_Port.Text.Trim()));              try             {                 listenSocket.Bind(endPoint);             }             catch (Exception ex)             {                 MessageBox.Show("服务器开启失败:" + ex.Message, "开启服务器");                 return;             }              //第三步:调用listen()函数使套接字成为一个监听套接字             listenSocket.Listen(10);              ShowMessage("服务器开启成功");              //开启一个线程监听             Task.Run(new Action(() =>                 {                     ListenConnection();                 }                 ));              this.btn_StartService.Enabled = false;           }          private void ListenConnection()         {             while (true)             {                 Socket clientSocket = listenSocket.Accept();                  string ip = clientSocket.RemoteEndPoint.ToString();                  //更新在线列表                 AddOnLine(ip, true);                 //更新在线列表集合                 OnLineList.Add(ip, clientSocket);                  ShowMessage(ip + "上线了");                  Task.Run(() => ReceiveMsg(clientSocket));              }           }           ///          /// 接收方法         ///          ///          private void ReceiveMsg(Socket clientSocket)         {             while (true)             {                 //定义一个2M的缓冲区                 byte[] buffer = new byte[1024 * 1024 * 2];                  int length = -1;                 try                 {                     length = clientSocket.Receive(buffer);                 }                 catch (Exception)                 {                      //客户端下线了                      //更新在线列表                     string ip = clientSocket.RemoteEndPoint.ToString();                      AddOnLine(ip, false);                      OnLineList.Remove(ip);                      break;                 }                  if (length == 0)                 {                     //客户端下线了                      //更新在线列表                     string ip = clientSocket.RemoteEndPoint.ToString();                      AddOnLine(ip, false);                      OnLineList.Remove(ip);                      break;                 }                   if (length > 0)                 {                     string info = econding.GetString(buffer, 0, length);                     ShowMessage(info);                 }             }         }          ///          /// 在线列表更新         ///          ///          ///          private void AddOnLine(string clientIp, bool value)         {             Invoke(new Action(() =>             {                 if (value)                 {                     this.lst_Online.Items.Add(clientIp);                 }                 else                 {                     this.lst_Online.Items.Remove(clientIp);                 }              }));          }           ///          /// 更新接收区         ///          ///          private void ShowMessage(string info)         {             Invoke(new Action(() =>             {                 this.txt_Rcv.AppendText(CurrentTime + info + Environment.NewLine);             }));          }          ///          /// 消息发送         ///          ///          ///          private void btn_Send_Click(object sender, EventArgs e)         {             if (this.lst_Online.SelectedItem != null)             {                 foreach (string item in this.lst_Online.SelectedItems)                 {                     if (OnLineList.ContainsKey(item))                     {                         OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));                     }                 }             }             else             {                 MessageBox.Show("请先选择要发送的对象", "发送消息");             }          }          ///          /// 群发功能         ///          ///          ///          private void btn_SendAll_Click(object sender, EventArgs e)         {             foreach (string item in this.lst_Online.Items)             {                 if (OnLineList.ContainsKey(item))                 {                     OnLineList[item].Send(econding.GetBytes(this.txt_Send.Text.Trim()));                 }             }         }     } } 

7.运行效果

        7.1 运行界面演示

         7.2 接收消息界面演示

         7.3 发送消息界面演示

         7.4 群发消息演示

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

如果你觉得我的分享有价值,那就请为我点赞收藏吧!你们的支持是我继续分享的动力。希望大家能够积极评论,让我知道你们的想法和建议。谢谢!

相关内容

热门资讯

记者获悉!兴动互娱辅助免费下载... 记者获悉!兴动互娱辅助免费下载(辅助挂)其实真的是有挂(有挂秘籍)-哔哩哔哩兴动互娱辅助免费下载是一...
随着!xpoker辅助控制(透... 随着!xpoker辅助控制(透视)原来真的有挂(真的有挂开挂辅助脚本)-哔哩哔哩1、每一步都需要思考...
近日!wepoker永久免费脚... 近日!wepoker永久免费脚本,扑克之星辅助,手段教程(一贯透视确实有挂)-哔哩哔哩1、wepok...
日前!创思维辅助器(辅助挂)一... 日前!创思维辅助器(辅助挂)一贯是有挂的(有挂指南书)-哔哩哔哩1、起透看视 创思维辅助器透明视辅助...
据报道!hhpoker怎么破解... 据报道!hhpoker怎么破解(透视)果然是有挂(证实有挂开挂辅助下载)-哔哩哔哩1、每一步都需要思...
有玩家发现!hhpoker辅助... 有玩家发现!hhpoker辅助靠谱吗,德扑圈透视,经验教程(其实透视确实有挂)-哔哩哔哩1、hhpo...
于此同时!蜀渝牌乐汇挂机软件(... 于此同时!蜀渝牌乐汇挂机软件(辅助挂)原来是有挂的(有挂手册)-哔哩哔哩1、于此同时!蜀渝牌乐汇挂机...
围绕透视问题!wepokerp... 围绕透视问题!wepokerplus辅助(透视)其实是有挂(有挂工具开挂辅助工具)-哔哩哔哩1、we...
不少玩家反映!来玩app破解,... 不少玩家反映!来玩app破解,德扑之心免费透视,手段教程(果然透视有挂)-哔哩哔哩1.德扑之心免费透...
今日!牌乐们黑科技试用(辅助挂... 今日!牌乐们黑科技试用(辅助挂)一贯是有挂的(有挂要领)-哔哩哔哩牌乐们黑科技试用辅助器中分为三种模...