1.原理

长连接和短连接在程序上基本没有区别,区别是短连接每次发送完消息都要调用Close()方法来释放资源,而长连接则不调用Close()方法,从而保持持续不断的通信功能。

2.Socket服务端代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace SocketServer
  10. {
  11. class Program
  12. {
  13. static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  14. private static byte[] result = new byte[1024];
  15. static void Main(string[] args)
  16. {
  17. SocketServie();
  18. }
  19. public static void SocketServie()
  20. {
  21. Console.WriteLine("服务端已启动");
  22. string host = "127.0.0.1";//IP地址
  23. int port = 2000;//端口
  24. socket.Bind(new IPEndPoint(IPAddress.Parse(host), port));
  25. socket.Listen(100);//设定最多100个排队连接请求
  26. Thread myThread = new Thread(ListenClientConnect);//通过多线程监听客户端连接
  27. myThread.Start();
  28. Console.ReadLine();
  29. }
  30. /// <summary>
  31. /// 监听客户端连接
  32. /// </summary>
  33. private static void ListenClientConnect()
  34. {
  35. while (true)
  36. {
  37. Socket clientSocket = socket.Accept();
  38. clientSocket.Send(Encoding.UTF8.GetBytes("我是服务器"));
  39. Thread receiveThread = new Thread(ReceiveMessage);
  40. receiveThread.Start(clientSocket);
  41. }
  42. }
  43. /// <summary>
  44. /// 接收消息
  45. /// </summary>
  46. /// <param name="clientSocket"></param>
  47. private static void ReceiveMessage(object clientSocket)
  48. {
  49. Socket myClientSocket = (Socket)clientSocket;
  50. while (true)
  51. {
  52. try
  53. {
  54. //通过clientSocket接收数据
  55. int receiveNumber = myClientSocket.Receive(result);
  56. if (receiveNumber == 0)
  57. return;
  58. Console.WriteLine("接收客户端{0} 的消息:{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
  59. //给Client端返回信息
  60. string sendStr = "已成功接到您发送的消息";
  61. byte[] bs = Encoding.UTF8.GetBytes(sendStr);//Encoding.UTF8.GetBytes()不然中文会乱码
  62. myClientSocket.Send(bs, bs.Length, 0); //返回信息给客户端
  63. //myClientSocket.Close(); //发送完数据关闭Socket并释放资源//长连接的话就不关闭
  64. //Console.ReadLine();
  65. }
  66. catch (Exception ex)
  67. {
  68. Console.WriteLine(ex.Message);
  69. myClientSocket.Close();//关闭Socket并释放资源
  70. myClientSocket.Shutdown(SocketShutdown.Both);//禁止发送和上传
  71. break;
  72. }
  73. }
  74. }
  75. }
  76. }

3.Socket客户端代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace SocketClient
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. //短连接
  15. shotlink("");
  16. //长连接
  17. //longlink();
  18. }
  19. /// <summary>
  20. /// 短连接,最后调用Close释放资源
  21. /// </summary>
  22. /// <param name="input"></param>
  23. public static void shotlink(string input)
  24. {
  25. //设定服务器IP地址
  26. IPAddress ip = IPAddress.Parse("127.0.0.1");
  27. Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  28. try
  29. {
  30. clientSocket.Connect(new IPEndPoint(ip, 2000)); //配置服务器IP与端口
  31. Console.WriteLine("连接服务器成功");
  32. }
  33. catch
  34. {
  35. Console.WriteLine("连接服务器失败,请按回车键退出!");
  36. Console.ReadLine();
  37. return;
  38. }
  39. string sendMessage = "你好";//发送到服务端的内容
  40. clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));//向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码
  41. Console.WriteLine("向服务器发送消息:" + sendMessage);
  42. //接受从服务器返回的信息
  43. string recvStr = "";
  44. byte[] recvBytes = new byte[1024];
  45. int bytes;
  46. bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息
  47. recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
  48. Console.WriteLine("服务端发来消息:{0}", recvStr);//回显服务器的返回信息
  49. //每次完成通信后,关闭连接并释放资源
  50. clientSocket.Close();
  51. Console.ReadLine();
  52. }
  53. /// <summary>
  54. /// 长连接不调用Close释放资源
  55. /// </summary>
  56. public static void longlink()
  57. {
  58. //设定服务器IP地址
  59. IPAddress ip = IPAddress.Parse("127.0.0.1");
  60. Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  61. try
  62. {
  63. clientSocket.Connect(new IPEndPoint(ip, 2000)); //配置服务器IP与端口
  64. Console.WriteLine("连接服务器成功");
  65. }
  66. catch
  67. {
  68. Console.WriteLine("连接服务器失败,请按回车键退出!");
  69. Console.ReadLine();
  70. return;
  71. }
  72. //循环读取输入数据
  73. while (true)
  74. {
  75. Console.WriteLine("请输入");
  76. string sentstr = Console.ReadLine();
  77. SentMsg(sentstr, clientSocket);
  78. }
  79. }
  80. /// <summary>
  81. /// 长连接,不释放资源
  82. /// </summary>
  83. /// <param name="sentstr"></param>
  84. /// <param name="clientSocket"></param>
  85. public static void SentMsg(string sentstr, Socket clientSocket)
  86. {
  87. string sendMessage = "你好";//发送到服务端的内容
  88. sendMessage = sentstr;//发送到服务端的内容
  89. //向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码
  90. clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));
  91. Console.WriteLine("向服务器发送消息:" + sendMessage);
  92. //接受从服务器返回的信息
  93. string recvStr = "";
  94. byte[] recvBytes = new byte[1024];
  95. int bytes;
  96. bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息
  97. recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
  98. Console.WriteLine("服务端发来消息:{0}", recvStr); //回显服务器的返回信息
  99. //clientSocket.Close();//关闭连接并释放资源//如果是长连接,注释掉close
  100. }
  101. }
  102. }