找回密码
 立即注册
首页 业界区 业界 C# Socket教程入门,Socket的使用方法,附可执行Demo ...

C# Socket教程入门,Socket的使用方法,附可执行Demo

遑盲 2025-6-2 00:33:46
核心:

在服务器端和客户端的两个Socket实例,共同维持一个连接,而我们还需要一个服务端绑定了特定端口号的固定的serverSocket,用来监听远方clientSocket的申请,并为这个申请建立服务端对应的proxSocket
服务器维护:serverSocket
服务端实例客户端实例关系proxSocketclientSocket一一对应微软官方文档
一、要有服务端

--配置--

1、new Socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、Bind
ServerSocket.Bind(new IPEndPoint(IPAddress.Parse(txtIP), int.Parse(txtPost))); //服务器绑定本机IP和端口
3、Listen
ServerSocket.Listen(10); //最大连接数是10
4、Accept
Socket proxSocket = ServerSocket.Accept(); //监听Socket连接行为,并为监听到的链接创建Socket实例,会阻塞线程直到端口链接
--信息发送与传输--

5、Receive
proxSocket.Receive(data, 0, data.Length, SocketFlags.None); //data是要写入的byte数组,会阻塞线程直到侦听到slientSocket的Send并持续到IO结束
6、Send
proxSocket.Send(result, 0, result.Length, SocketFlags.None); //result是要上传的byte数组
二、还有客户端

--配置--

1、new Socet
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、Connect
ClientSocket.Connect(new IPEndPoint(IPAddress.Parse(txtIP), int.Parse(txtPort)));  //尝试链接服务器的相应IP和端口,连接成功后,服务器端创建一个特定的proxSocket用来进行信息交换
--信息发送与传输--

3
ClientSocket.Receive(data, 0, data.Length, SocketFlags.None);
4
ClientSocket.Send(result, 0, result.Length, SocketFlags.None);
三、简单实现
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. namespace SockerDamo
  6. {
  7.     class SocketServer
  8.     {
  9.         List<Socket> ClientProxSocketList = new List<Socket>();//用于存放客户端链接
  10.         Socket ServerSocket { get; set; }
  11.         public void Start()//创建服务器Socket,开始侦听客户端,并开始循环接收消息
  12.         {
  13.             //1.创建socket对象
  14.             Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  15.             ServerSocket = serverSocket;
  16.             //first is 寻址方式(此处是Ipv4)
  17.             //second is the socket's type
  18.             //And the thrid is the 传输协议
  19.             System.Console.WriteLine("请输入IP地址:");
  20.             String txtIP = Console.ReadLine();
  21.             System.Console.WriteLine("请输入端口号:");
  22.             String txtPost = Console.ReadLine();
  23.             //2.绑定端口IP
  24.             ServerSocket.Bind(new IPEndPoint(IPAddress.Parse(txtIP), int.Parse(txtPost)));
  25.             //socket's Bind action need a IPEndPoint to bind the socket and the computer's ip and post
  26.             //so in the IPEndPoint we need a IPAddress and a int number(Post)
  27.             //3.开始侦听
  28.             ServerSocket.Listen(20);//the number 表示 同时排队的最大限制数量
  29.             //同时来了100个链接请求,只能处理一个链接,队列里面放20个等待链接的客户端,其他的返回错误消息。
  30.             //4.开始接受客户端的链接
  31.             //为了不阻塞主线程,我们应该把以下代码放在一个新的线程(池)中
  32.             try
  33.             {
  34.                 System.Console.WriteLine("开始监听链接...");
  35.                 Socket proxSocket = ServerSocket.Accept();//这个方法会阻塞当前线程,直到监听到链接
  36.                 AppendTextToTxtLog(string.Format("客户端{0}已链接", proxSocket.RemoteEndPoint.ToString()));
  37.                 byte[] data = new byte[1024 * 1024 * 256];//用来放数据的数组
  38.                 int len;
  39.                 while (true)
  40.                 {
  41.                     System.Console.WriteLine("请选择模式:");
  42.                     System.Console.WriteLine("0.等待接收消息");
  43.                     System.Console.WriteLine("1.发送消息");
  44.                     string mo = Console.ReadLine();
  45.                     //获取客户端数据并返回读取的字节数,会阻塞当前线程,
  46.                     //当客户端突然掉线,往往会引发异常
  47.                     if (mo == "0")
  48.                     {
  49.                         try
  50.                         {
  51.                             len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);//往data数组里,从index=0开始,最长写入数据长度为data.Length
  52.                             if (data[0] == 0)
  53.                             {
  54.                                 StopConnect(proxSocket);
  55.                             }//正常退出逻辑
  56.                             else if (data[0] == 1)
  57.                             {
  58.                                 string str = Encoding.UTF8.GetString(data, 1, len - 1);//在data数组中从0开始,len个数据,转成str
  59.                                 AppendTextToTxtLog(string.Format("接收到客户端:{0} 的信息是:{1}", proxSocket.RemoteEndPoint.ToString(), str));
  60.                             }
  61.                         }
  62.                         catch (Exception)
  63.                         {
  64.                             Console.WriteLine("接收数据出错");
  65.                             StopConnect(proxSocket);
  66.                         }
  67.                     }
  68.                     else if (mo == "1")
  69.                     {
  70.                         SendMsg();
  71.                     }
  72.                 }
  73.             }
  74.             catch
  75.             {
  76.                 AppendTextToTxtLog("出问题啦:您在接收客户端的请求的时候,发生了异常,夭寿啦```");
  77.             }
  78.         }
  79.         private void StopConnect(Socket proxSocket)//停止链接
  80.         {
  81.             try
  82.             {
  83.                 if (proxSocket.Connected)
  84.                 {
  85.                     proxSocket.Shutdown(SocketShutdown.Both);
  86.                     proxSocket.Close(100);
  87.                 }
  88.             }
  89.             catch (Exception ex)
  90.             {
  91.                 System.Console.WriteLine("或许没有成功的停止连接" + ex.ToString());
  92.             }
  93.         }
  94.         //发送消息
  95.         private void SendMsg()
  96.         {
  97.             String txtMsg = Console.ReadLine();
  98.             foreach (var proxSocket in ClientProxSocketList)
  99.             {
  100.                 if (proxSocket.Connected)
  101.                 {
  102.                     byte[] data = Encoding.UTF8.GetBytes(txtMsg);//信息转二进制
  103.                     byte[] result = new byte[data.Length + 1];//信息的二进制放在1~data.Length
  104.                     result[0] = 1;//第0个位置是标志位,将来我们可以用这个标志位,分辨文件类型,将来用来传文件
  105.                     Buffer.BlockCopy(data, 0, result, 1, data.Length);//把 data从0 转 result从1 长度data.Length
  106.                     proxSocket.Send(result, 0, result.Length, SocketFlags.None);//发送消息
  107.                 }
  108.             }
  109.             AppendTextToTxtLog(string.Format("{0}(本机) 的信息是:{1}", ServerSocket.LocalEndPoint.ToString(), txtMsg));
  110.         }
  111.         private void AppendTextToTxtLog(string txt)
  112.         {
  113.             Console.WriteLine(txt);
  114.         }
  115.     }
  116.     class SocketClient
  117.     {
  118.         Socket ClientSocket { get; set; }
  119.         public void Start()//创建客户端Socket,并开始循环接收消息
  120.         {
  121.             #region 获取服务器端口内容
  122.             System.Console.WriteLine("请输入服务器IP:");
  123.             String txtIP = Console.ReadLine();
  124.             System.Console.WriteLine("请输入端口号:");
  125.             String txtPort = Console.ReadLine();
  126.             #endregion
  127.             //客户端链接服务器端
  128.             //1.创建Socket对象
  129.             ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  130.             //2.连接服务器端Socket
  131.             try//如果服务器的Listen队列已满,那么就会返回一个异常
  132.             {
  133.                 ClientSocket.Connect(new IPEndPoint(IPAddress.Parse(txtIP), int.Parse(txtPort)));
  134.             }
  135.             catch
  136.             {
  137.                 System.Console.WriteLine("当前服务器无法连接");
  138.                 //Thread.Sleep(1000);
  139.                 return;
  140.             }
  141.             //3.接收服务器端消息
  142.             byte[] data = new byte[1024 * 1024 * 256];//传输数据放在这里,这里是256MB = 256 * 1024 KB = 256 * 1024 * 1024Byte
  143.             int len;
  144.             string str;
  145.             string wenJianMing = "";
  146.             while (true)
  147.             {
  148.                 System.Console.WriteLine("请选择模式:");
  149.                 System.Console.WriteLine("0.等待接收消息");
  150.                 System.Console.WriteLine("1.发送消息");
  151.                 string mo = Console.ReadLine();
  152.                 len = 0;
  153.                 str = null;
  154.                 if (mo == "0")
  155.                     try
  156.                     {
  157.                         len = ClientSocket.Receive(data, 0, data.Length, SocketFlags.None);//获取服务器端数据并返回读取的字节数,会阻塞当前线程,
  158.                                                                                         //当客户端突然掉线,往往会引发异常
  159.                         if (data[0] == 0)//模式0退出
  160.                         {
  161.                             AppendTextToTxtLog(string.Format("服务端:{0} 正常退出", ClientSocket.RemoteEndPoint.ToString()));
  162.                             StopConnect();
  163.                         }
  164.                         else if (data[0] == 1)
  165.                         {//模式1收到了字符串
  166.                             str = Encoding.UTF8.GetString(data, 1, len - 1);
  167.                             AppendTextToTxtLog(string.Format("Socket信息:{0}", str));
  168.                         }
  169.                         //一次类推,总共有256种消息的传输模式
  170.                     }
  171.                     catch (Exception)
  172.                     {
  173.                         AppendTextToTxtLog(string.Format("服务端:{0} 非正常退出",
  174.                             ClientSocket.RemoteEndPoint.ToString()));
  175.                         StopConnect();
  176.                         return;
  177.                     }
  178.                 else if(mo == "1"){
  179.                     SendMsg();
  180.                 }
  181.             }
  182.             // 也可以将第3步写入方法ReceiveData
  183.             // Thread thread = new Thread(new ParameterizedThreadStart(ReceiveData));
  184.             // thread.IsBackground = true;
  185.             // thread.Start(); // 然后开启线程
  186.         }
  187.         private void AppendTextToTxtLog(string txt)
  188.         {
  189.             Console.WriteLine(txt);
  190.         }
  191.         private void StopConnect()
  192.         {
  193.             try
  194.             {
  195.                 if (ClientSocket.Connected)
  196.                 {
  197.                     ClientSocket.Shutdown(SocketShutdown.Both);
  198.                     ClientSocket.Close(100);
  199.                 }
  200.             }
  201.             catch (Exception ex)
  202.             {
  203.                 System.Console.WriteLine("或许没有成功的停止连接" + ex.ToString());
  204.             }
  205.         }
  206.         public void SendMsg()
  207.         {
  208.             if (ClientSocket.Connected)
  209.             {
  210.                 System.Console.WriteLine("请输入要发送信息的模式:");
  211.                 System.Console.WriteLine("0:结束");
  212.                 System.Console.WriteLine("1:字符串");
  213.                 String ms = Console.ReadLine();
  214.                 if (ms == "0") { }
  215.                 if (ms == "1")
  216.                 {
  217.                     System.Console.WriteLine("请输入要发送的消息:");
  218.                     String s = Console.ReadLine();
  219.                     byte[] data = Encoding.UTF8.GetBytes(s);
  220.                     byte[] result = new byte[data.Length + 1];//信息的二进制放在1~data.Length
  221.                     result[0] = 1;//第0个位置是标志位,将来我们可以用这个标志位,分辨文件类型,将来用来传文件
  222.                     Buffer.BlockCopy(data, 0, result, 1, data.Length);//把 data从0 转 result从1 长度data.Length
  223.                     ClientSocket.Send(result, 0, result.Length, SocketFlags.None);//发送消息
  224.                     AppendTextToTxtLog(string.Format("本机的信息是:{0}", s));
  225.                 }
  226.             }
  227.         }
  228.     }
  229.     internal class Program
  230.     {
  231.         static void Main(string[] args)
  232.         {
  233.             System.Console.WriteLine("0:服务器端");
  234.             System.Console.WriteLine("1:客户端");
  235.             string ms = Console.ReadLine();
  236.             if (ms == "0")
  237.             {
  238.                 SocketServer server = new SocketServer();
  239.                 server.Start();
  240.             }
  241.             else if (ms == "1")
  242.             {
  243.                 SocketClient client = new SocketClient();
  244.                 client.Start();
  245.             }
  246.         }
  247.     }
  248. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册