2023年8月3日发(作者:)

C#实现长连接实现长连接前我们先了解下长连接与短连接的区别,明⽩何时选⽤长连接何时选⽤短连接。长连接与短连接长连接:client⽅与server⽅先建⽴连接,连接建⽴后不断开,然后再进⾏报⽂发送和接收。这种⽅式下由于通讯连接⼀直存在。此种⽅式常⽤于P2P通信。短连接:Client⽅与server每进⾏⼀次报⽂收发交易时才进⾏通讯连接,交易完毕后⽴即断开连接。此⽅式常⽤于⼀点对多点通讯。长连接与短连接的操作过程短连接的操作步骤是:建⽴连接——数据传输——关闭连接…建⽴连接——数据传输——关闭连接长连接的操作步骤是:建⽴连接——数据传输…(保持连接)…数据传输——关闭连接何时使⽤长连接何时使⽤短连接因为长连接会⼀直保持,想象⼀个场景,如果同时有⼀百个系统向⼀个系统发送数据,如果监理长连接,那么就需要监理⼀万个连接可想⽽知服务器的压⼒有多⼤。 如果使⽤短连接只需要建⽴⼀个连接。因此并发量⼤,但是每个⽤户⼜不需频繁操作的情况下需要短连接。长连接适合频繁操作,点对点操作。长连接可以省去较多TCP建⽴与关闭的操作减少浪费,节约时间,对于频繁请求资源的客户来说适合⽤长连接。如果短连接不关闭可以视为长连接吗?当然长连接和短连接在程序上基本没有区别,区别是短连接每次发送完消息都要调⽤Close()⽅法来释放资源,⽽长连接则不调⽤Close()⽅法,从⽽保持持续不断的通信功能。实现短链接长连接//

服务端using System;using c;using ;using ;using s;using ;using ing;using ;

namespace SocketServer{ class Program { static Socket socket = new Socket(etwork, , ); private static byte[] result = new byte[1024];

static void Main(string[] args) { SocketServie(); }

public static void SocketServie() { ine("服务端已启动"); string host = "127.0.0.1";//IP地址 int port = 2000;//端⼝ (new IPEndPoint((host), port)); (100);//设定最多100个排队连接请求

Thread myThread = new Thread(ListenClientConnect);//通过多线程监听客户端连接

(); (); ne(); }

///

///

监听客户端连接

///

private static void ListenClientConnect() { while (true) { Socket clientSocket = (); (es("我是服务器")); Thread receiveThread = new Thread(ReceiveMessage); (clientSocket); } }

///

///

接收消息

///

///

private static void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; while (true) { try { //通过clientSocket接收数据

int receiveNumber = e(result); if (receiveNumber == 0) return; ine("接收客户端{0} 的消息:{1}", ng(), ing(result, 0, receiveNumber)); //给Client端返回信息 string sendStr = "已成功接到您发送的消息"; byte[] bs = es(sendStr);//es()不然中⽂会乱码 (bs, , 0); //返回信息给客户端 //(); //发送完数据关闭Socket并释放资源//长连接的话就不关闭 //ne(); } catch (Exception ex) { ine(e); ();//关闭Socket并释放资源 wn();//禁⽌发送和上传 break; } } } }}下⾯展⽰⼀些

内联代码⽚。//

客户端using System;using c;using ;using ;using s;using ;using ;

namespace SocketClientnamespace SocketClient{ class Program { static void Main(string[] args) { //短连接 shotlink(""); //长连接 //longlink(); }

///

///

短连接,最后调⽤Close释放资源 ///

/// public static void shotlink(string input) { //设定服务器IP地址

IPAddress ip = ("127.0.0.1"); Socket clientSocket = new Socket(etwork, , ); try { t(new IPEndPoint(ip, 2000)); //配置服务器IP与端⼝

ine("连接服务器成功"); } catch { ine("连接服务器失败,请按回车键退出!"); ne(); return; }

string sendMessage = "你好";//发送到服务端的内容 (es(sendMessage));//向服务器发送数据,需要发送中⽂则需要使⽤es(),否则会乱码 ine("向服务器发送消息:" + sendMessage);

//接受从服务器返回的信息 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = e(recvBytes, , 0); //从服务器端接受返回信息

recvStr += ing(recvBytes, 0, bytes); ine("服务端发来消息:{0}", recvStr);//回显服务器的返回信息 //每次完成通信后,关闭连接并释放资源 (); ne(); }

///

///

长连接不调⽤Close释放资源 ///

public static void longlink() { //设定服务器IP地址

IPAddress ip = ("127.0.0.1"); Socket clientSocket = new Socket(etwork, , ); try { t(new IPEndPoint(ip, 2000)); //配置服务器IP与端⼝

ine("连接服务器成功"); } catch catch { ine("连接服务器失败,请按回车键退出!"); ne(); return; }

//循环读取输⼊数据 while (true) { ine("请输⼊"); string sentstr = ne(); SentMsg(sentstr, clientSocket); } }

///

///

长连接,不释放资源 ///

/// /// public static void SentMsg(string sentstr, Socket clientSocket) { string sendMessage = "你好";//发送到服务端的内容 sendMessage = sentstr;//发送到服务端的内容 //向服务器发送数据,需要发送中⽂则需要使⽤es(),否则会乱码 (es(sendMessage)); ine("向服务器发送消息:" + sendMessage);

//接受从服务器返回的信息 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = e(recvBytes, , 0); //从服务器端接受返回信息

recvStr += ing(recvBytes, 0, bytes); ine("服务端发来消息:{0}", recvStr); //回显服务器的返回信息 //();//关闭连接并释放资源//如果是长连接,注释掉close } }}

2023年8月3日发(作者:)

C#实现长连接实现长连接前我们先了解下长连接与短连接的区别,明⽩何时选⽤长连接何时选⽤短连接。长连接与短连接长连接:client⽅与server⽅先建⽴连接,连接建⽴后不断开,然后再进⾏报⽂发送和接收。这种⽅式下由于通讯连接⼀直存在。此种⽅式常⽤于P2P通信。短连接:Client⽅与server每进⾏⼀次报⽂收发交易时才进⾏通讯连接,交易完毕后⽴即断开连接。此⽅式常⽤于⼀点对多点通讯。长连接与短连接的操作过程短连接的操作步骤是:建⽴连接——数据传输——关闭连接…建⽴连接——数据传输——关闭连接长连接的操作步骤是:建⽴连接——数据传输…(保持连接)…数据传输——关闭连接何时使⽤长连接何时使⽤短连接因为长连接会⼀直保持,想象⼀个场景,如果同时有⼀百个系统向⼀个系统发送数据,如果监理长连接,那么就需要监理⼀万个连接可想⽽知服务器的压⼒有多⼤。 如果使⽤短连接只需要建⽴⼀个连接。因此并发量⼤,但是每个⽤户⼜不需频繁操作的情况下需要短连接。长连接适合频繁操作,点对点操作。长连接可以省去较多TCP建⽴与关闭的操作减少浪费,节约时间,对于频繁请求资源的客户来说适合⽤长连接。如果短连接不关闭可以视为长连接吗?当然长连接和短连接在程序上基本没有区别,区别是短连接每次发送完消息都要调⽤Close()⽅法来释放资源,⽽长连接则不调⽤Close()⽅法,从⽽保持持续不断的通信功能。实现短链接长连接//

服务端using System;using c;using ;using ;using s;using ;using ing;using ;

namespace SocketServer{ class Program { static Socket socket = new Socket(etwork, , ); private static byte[] result = new byte[1024];

static void Main(string[] args) { SocketServie(); }

public static void SocketServie() { ine("服务端已启动"); string host = "127.0.0.1";//IP地址 int port = 2000;//端⼝ (new IPEndPoint((host), port)); (100);//设定最多100个排队连接请求

Thread myThread = new Thread(ListenClientConnect);//通过多线程监听客户端连接

(); (); ne(); }

///

///

监听客户端连接

///

private static void ListenClientConnect() { while (true) { Socket clientSocket = (); (es("我是服务器")); Thread receiveThread = new Thread(ReceiveMessage); (clientSocket); } }

///

///

接收消息

///

///

private static void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; while (true) { try { //通过clientSocket接收数据

int receiveNumber = e(result); if (receiveNumber == 0) return; ine("接收客户端{0} 的消息:{1}", ng(), ing(result, 0, receiveNumber)); //给Client端返回信息 string sendStr = "已成功接到您发送的消息"; byte[] bs = es(sendStr);//es()不然中⽂会乱码 (bs, , 0); //返回信息给客户端 //(); //发送完数据关闭Socket并释放资源//长连接的话就不关闭 //ne(); } catch (Exception ex) { ine(e); ();//关闭Socket并释放资源 wn();//禁⽌发送和上传 break; } } } }}下⾯展⽰⼀些

内联代码⽚。//

客户端using System;using c;using ;using ;using s;using ;using ;

namespace SocketClientnamespace SocketClient{ class Program { static void Main(string[] args) { //短连接 shotlink(""); //长连接 //longlink(); }

///

///

短连接,最后调⽤Close释放资源 ///

/// public static void shotlink(string input) { //设定服务器IP地址

IPAddress ip = ("127.0.0.1"); Socket clientSocket = new Socket(etwork, , ); try { t(new IPEndPoint(ip, 2000)); //配置服务器IP与端⼝

ine("连接服务器成功"); } catch { ine("连接服务器失败,请按回车键退出!"); ne(); return; }

string sendMessage = "你好";//发送到服务端的内容 (es(sendMessage));//向服务器发送数据,需要发送中⽂则需要使⽤es(),否则会乱码 ine("向服务器发送消息:" + sendMessage);

//接受从服务器返回的信息 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = e(recvBytes, , 0); //从服务器端接受返回信息

recvStr += ing(recvBytes, 0, bytes); ine("服务端发来消息:{0}", recvStr);//回显服务器的返回信息 //每次完成通信后,关闭连接并释放资源 (); ne(); }

///

///

长连接不调⽤Close释放资源 ///

public static void longlink() { //设定服务器IP地址

IPAddress ip = ("127.0.0.1"); Socket clientSocket = new Socket(etwork, , ); try { t(new IPEndPoint(ip, 2000)); //配置服务器IP与端⼝

ine("连接服务器成功"); } catch catch { ine("连接服务器失败,请按回车键退出!"); ne(); return; }

//循环读取输⼊数据 while (true) { ine("请输⼊"); string sentstr = ne(); SentMsg(sentstr, clientSocket); } }

///

///

长连接,不释放资源 ///

/// /// public static void SentMsg(string sentstr, Socket clientSocket) { string sendMessage = "你好";//发送到服务端的内容 sendMessage = sentstr;//发送到服务端的内容 //向服务器发送数据,需要发送中⽂则需要使⽤es(),否则会乱码 (es(sendMessage)); ine("向服务器发送消息:" + sendMessage);

//接受从服务器返回的信息 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = e(recvBytes, , 0); //从服务器端接受返回信息

recvStr += ing(recvBytes, 0, bytes); ine("服务端发来消息:{0}", recvStr); //回显服务器的返回信息 //();//关闭连接并释放资源//如果是长连接,注释掉close } }}