翼度科技»论坛 编程开发 .net 查看内容

C# 使用Socket实现长链接和短连接

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
直接上代码
服务端:
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. namespace SocketServer
  9. {
  10.     /// <summary>
  11.     /// MainWindow.xaml 的交互逻辑
  12.     /// </summary>
  13.     public partial class MainWindow : Window
  14.     {
  15.         private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.         private byte[] _result = new byte[1024];
  17.         public MainWindow()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  22.         {
  23.             SocketService();
  24.         }
  25.         public void SocketService()
  26.         {
  27.             textBlock.Text +=  ("服务端已启动");
  28.             var host = "127.0.0.1";
  29.             var port = 5000;
  30.             _socket.Bind(new IPEndPoint(IPAddress.Parse(host), port));
  31.             _socket.Listen(10); // 设定最多10个排队连接请求
  32.             Task.Run(ListenClientConnect);
  33.         }
  34.         private void ListenClientConnect()
  35.         {
  36.             while (true)
  37.             {
  38.                 var clientSocket = _socket.Accept();
  39.                 clientSocket.Send(Encoding.UTF8.GetBytes("我是服务器"));
  40.                 var receiveThread = new Thread(ReceiveMessage);
  41.                 receiveThread.Start(clientSocket);
  42.             }
  43.         }
  44.         private void ReceiveMessage(object clientSocket)
  45.         {
  46.             Socket myClientSocket = (Socket)clientSocket;
  47.             while (true)
  48.             {
  49.                 try
  50.                 {
  51.                     //通过clientSocket接收数据  
  52.                     int receiveNumber = myClientSocket.Receive(_result);
  53.                     if (receiveNumber == 0)
  54.                         return;
  55.                     Application.Current.Dispatcher.Invoke(() =>
  56.                     {
  57.                         textBlock.Text += string.Format("接收客户端{0} 的消息:{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(_result, 0, receiveNumber));
  58.                     });
  59.                     
  60.                     //给Client端返回信息
  61.                     string sendStr = "已成功接到您发送的消息";
  62.                     byte[] bs = Encoding.UTF8.GetBytes(sendStr);//Encoding.UTF8.GetBytes()不然中文会乱码
  63.                     myClientSocket.Send(bs, bs.Length, 0);  //返回信息给客户端
  64.                     //myClientSocket.Close(); //发送完数据关闭Socket并释放资源//长连接的话就不关闭
  65.                     //Console.ReadLine();
  66.                 }
  67.                 catch (Exception ex)
  68.                 {
  69.                     Application.Current.Dispatcher.Invoke(() =>
  70.                     {
  71.                         textBlock.Text += (ex.Message);
  72.                     });
  73.                     myClientSocket.Close();//关闭Socket并释放资源
  74.                     //myClientSocket.Shutdown(SocketShutdown.Both);//禁止发送和上传
  75.                     break;
  76.                 }
  77.             }
  78.         }
  79.     }
  80. }
复制代码
客户端:
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Windows;
  7. namespace SocketClient
  8. {
  9.     /// <summary>
  10.     /// MainWindow.xaml 的交互逻辑
  11.     /// </summary>
  12.     public partial class MainWindow : Window
  13.     {
  14.         public MainWindow()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.         private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  19.         {
  20.             ShotLink("321");
  21.             // LongLink();
  22.         }
  23.         /// <summary>
  24.         /// 短连接,最后调用Close释放资源
  25.         /// </summary>
  26.         /// <param name="input"></param>
  27.         private void ShotLink(string input)
  28.         {
  29.             //设定服务器IP地址  
  30.             IPAddress ip = IPAddress.Parse("127.0.0.1");
  31.             Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  32.             try
  33.             {
  34.                 clientSocket.Connect(new IPEndPoint(ip, 5000)); //配置服务器IP与端口  
  35.                 textBlock.Text +=  ("连接服务器成功");
  36.             }
  37.             catch
  38.             {
  39.                 textBlock.Text +=  ("连接服务器失败!");
  40.                 return;
  41.             }
  42.             string sendMessage = "你好";//发送到服务端的内容
  43.             clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));//向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码
  44.             textBlock.Text +=  ("向服务器发送消息:" + sendMessage);
  45.             //接受从服务器返回的信息
  46.             string recvStr = "";
  47.             byte[] recvBytes = new byte[1024];
  48.             int bytes;
  49.             bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0);    //从服务器端接受返回信息
  50.             recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
  51.             textBlock.Text +=  string.Format("服务端发来消息:{0}", recvStr);//回显服务器的返回信息
  52.             //每次完成通信后,关闭连接并释放资源
  53.             clientSocket.Close();
  54.             Console.ReadLine();
  55.         }
  56.         /// <summary>
  57.         /// 长连接不调用Close释放资源
  58.         /// </summary>
  59.         private void LongLink()
  60.         {
  61.             //设定服务器IP地址  
  62.             IPAddress ip = IPAddress.Parse("127.0.0.1");
  63.             Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  64.             try
  65.             {
  66.                 clientSocket.Connect(new IPEndPoint(ip, 5000)); //配置服务器IP与端口  
  67.                 textBlock.Text +=  ("连接服务器成功");
  68.             }
  69.             catch
  70.             {
  71.                 textBlock.Text +=  ("连接服务器失败");
  72.                 return;
  73.             }
  74.             //循环读取输入数据
  75.             while (true)
  76.             {
  77.                 textBlock.Text +=  ("请输入");
  78.                 string sentstr = "123";
  79.                 SentMsg(sentstr, clientSocket);
  80.                 Thread.Sleep(5000);
  81.             }
  82.         }
  83.         /// <summary>
  84.         /// 长连接,不释放资源
  85.         /// </summary>
  86.         /// <param name="sentstr"></param>
  87.         /// <param name="clientSocket"></param>
  88.         private void SentMsg(string sentstr, Socket clientSocket)
  89.         {
  90.             string sendMessage = "你好";//发送到服务端的内容
  91.             sendMessage = sentstr;//发送到服务端的内容
  92.             //向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码
  93.             clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));
  94.             textBlock.Text +=  ("向服务器发送消息:" + sendMessage);
  95.             //接受从服务器返回的信息
  96.             string recvStr = "";
  97.             byte[] recvBytes = new byte[1024];
  98.             int bytes;
  99.             bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0);    //从服务器端接受返回信息
  100.             recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
  101.             textBlock.Text +=  string.Format("服务端发来消息:{0}", recvStr);    //回显服务器的返回信息
  102.             //clientSocket.Close();//关闭连接并释放资源//如果是长连接,注释掉close
  103.         }
  104.     }
  105. }
复制代码
 

来源:https://www.cnblogs.com/log9527blog/archive/2023/07/21/17572107.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具