1.原理
长连接和短连接在程序上基本没有区别,区别是短连接每次发送完消息都要调用Close()方法来释放资源,而长连接则不调用Close()方法,从而保持持续不断的通信功能。
2.Socket服务端代码:
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace SocketServer{class Program{static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);private static byte[] result = new byte[1024];static void Main(string[] args){SocketServie();}public static void SocketServie(){Console.WriteLine("服务端已启动");string host = "127.0.0.1";//IP地址int port = 2000;//端口socket.Bind(new IPEndPoint(IPAddress.Parse(host), port));socket.Listen(100);//设定最多100个排队连接请求Thread myThread = new Thread(ListenClientConnect);//通过多线程监听客户端连接myThread.Start();Console.ReadLine();}/// <summary>/// 监听客户端连接/// </summary>private static void ListenClientConnect(){while (true){Socket clientSocket = socket.Accept();clientSocket.Send(Encoding.UTF8.GetBytes("我是服务器"));Thread receiveThread = new Thread(ReceiveMessage);receiveThread.Start(clientSocket);}}/// <summary>/// 接收消息/// </summary>/// <param name="clientSocket"></param>private static void ReceiveMessage(object clientSocket){Socket myClientSocket = (Socket)clientSocket;while (true){try{//通过clientSocket接收数据int receiveNumber = myClientSocket.Receive(result);if (receiveNumber == 0)return;Console.WriteLine("接收客户端{0} 的消息:{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));//给Client端返回信息string sendStr = "已成功接到您发送的消息";byte[] bs = Encoding.UTF8.GetBytes(sendStr);//Encoding.UTF8.GetBytes()不然中文会乱码myClientSocket.Send(bs, bs.Length, 0); //返回信息给客户端//myClientSocket.Close(); //发送完数据关闭Socket并释放资源//长连接的话就不关闭//Console.ReadLine();}catch (Exception ex){Console.WriteLine(ex.Message);myClientSocket.Close();//关闭Socket并释放资源myClientSocket.Shutdown(SocketShutdown.Both);//禁止发送和上传break;}}}}}
3.Socket客户端代码:
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace SocketClient{class Program{static void Main(string[] args){//短连接shotlink("");//长连接//longlink();}/// <summary>/// 短连接,最后调用Close释放资源/// </summary>/// <param name="input"></param>public static void shotlink(string input){//设定服务器IP地址IPAddress ip = IPAddress.Parse("127.0.0.1");Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{clientSocket.Connect(new IPEndPoint(ip, 2000)); //配置服务器IP与端口Console.WriteLine("连接服务器成功");}catch{Console.WriteLine("连接服务器失败,请按回车键退出!");Console.ReadLine();return;}string sendMessage = "你好";//发送到服务端的内容clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));//向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码Console.WriteLine("向服务器发送消息:" + sendMessage);//接受从服务器返回的信息string recvStr = "";byte[] recvBytes = new byte[1024];int bytes;bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);Console.WriteLine("服务端发来消息:{0}", recvStr);//回显服务器的返回信息//每次完成通信后,关闭连接并释放资源clientSocket.Close();Console.ReadLine();}/// <summary>/// 长连接不调用Close释放资源/// </summary>public static void longlink(){//设定服务器IP地址IPAddress ip = IPAddress.Parse("127.0.0.1");Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{clientSocket.Connect(new IPEndPoint(ip, 2000)); //配置服务器IP与端口Console.WriteLine("连接服务器成功");}catch{Console.WriteLine("连接服务器失败,请按回车键退出!");Console.ReadLine();return;}//循环读取输入数据while (true){Console.WriteLine("请输入");string sentstr = Console.ReadLine();SentMsg(sentstr, clientSocket);}}/// <summary>/// 长连接,不释放资源/// </summary>/// <param name="sentstr"></param>/// <param name="clientSocket"></param>public static void SentMsg(string sentstr, Socket clientSocket){string sendMessage = "你好";//发送到服务端的内容sendMessage = sentstr;//发送到服务端的内容//向服务器发送数据,需要发送中文则需要使用Encoding.UTF8.GetBytes(),否则会乱码clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));Console.WriteLine("向服务器发送消息:" + sendMessage);//接受从服务器返回的信息string recvStr = "";byte[] recvBytes = new byte[1024];int bytes;bytes = clientSocket.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);Console.WriteLine("服务端发来消息:{0}", recvStr); //回显服务器的返回信息//clientSocket.Close();//关闭连接并释放资源//如果是长连接,注释掉close}}}
