当前位置:
首页 > Python基础教程 >
-
C#教程之也说Socket
网上有大量socket相关文章,茫茫多,大多交代不清,最近自我整理了一下socket相关知识,附加了大量代码注释,先看效果。
上代码,客户端:
1 Socket socket1 = null;//一个全局的socket对象 2 3 private void btnConnect_Click(object sender, EventArgs e) 4 { 5 //获得服务器ip和端口号 6 IPAddress ip = IPAddress.Parse(textBox1.Text); 7 int port =Convert.ToInt32( textBox2.Text); 8 9 //构造客户端socket,设置为tcp协议模式 10 socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 11 12 //连接 13 socket1.Connect(ip, port); 14 if (socket1.Connected)//如果连接成功 15 { 16 textBox3.Text += "连接成功\r\n"; 17 SendMsg(socket1, "发成功"); 18 19 string recMsg= ""; 20 //接收 21 ReceiveMsg(socket1, ref recMsg); 22 textBox3.Text +=recMsg;//文本显示 23 } 24 else 25 { 26 textBox3.Text += "连接不成功\r\n"; 27 } 28 } 29 30 private void btnSendMessage_Click(object sender, EventArgs e) 31 { 32 if (socket1.Connected) 33 { 34 string sendMsg = textBox4.Text; 35 36 //依据长度判断是否发送 37 if (sendMsg.Length <= 0) 38 { 39 return; 40 } 41 42 //拿到发送是否成功的标记 43 bool isSendSuccess = SendMsg(socket1, textBox4.Text); 44 45 string recMsg = ""; 46 bool isReceiveSuccess = ReceiveMsg(socket1, ref recMsg); 47 textBox3.Text += recMsg; 48 49 if (!(isSendSuccess&&isReceiveSuccess)) 50 { 51 textBox3.Text += "连接已断开,请重连"; 52 } 53 } 54 } 55 56 /// <summary> 57 /// 发送内容,并显示 58 /// </summary> 59 /// <param name="socket">发送内容的socket</param> 60 /// <param name="msg">输入字符串</param> 61 /// <returns>发送是否成功</returns> 62 private bool SendMsg(Socket socket, string msg) 63 { 64 try { 65 socket.Send(Encoding.UTF8.GetBytes(msg)); 66 return true; 67 } 68 catch (Exception e) 69 { 70 socket.Close(); 71 return false; 72 } 73 } 74 75 /// <summary> 76 /// 接收内容,并显示 77 /// </summary> 78 /// <param name="socket">接受内容的socket</param> 79 /// <param name="msg">输出字符串</param> 80 /// <returns>接收是否成功</returns> 81 private static bool ReceiveMsg(Socket socket ,ref string msg) 82 { 83 try 84 { 85 int recNumber;//接收到的字节数量 86 byte[] recBytes = new byte[1024];//缓冲字节数组 87 recNumber = socket.Receive(recBytes);//接收行为 88 byte[] recBytesForShort = new byte[recNumber];//byteArrayForDestination 89 Array.Copy(recBytes, recBytesForShort, recNumber);//拷贝 90 91 //显示文本构造 92 msg += (Encoding.UTF8.GetString(recBytesForShort) + "\r\n"); 93 94 return true; 95 } 96 catch (Exception e) 97 { 98 socket.Close(); 99 100 return false; 101 } 102 103 }
服务端:
1 static void Main(string[] args) 2 { 3 //设置监听的ip和端口号 4 IPAddress ip = IPAddress.Parse("192.168.120.56"); 5 IPEndPoint ipEP = new IPEndPoint(ip, 8088); 6 7 //迎宾socket 8 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 9 //绑定 10 serverSocket.Bind(ipEP); 11 //监听 12 serverSocket.Listen(10); 13 Console.WriteLine("监听已开\r\n"); 14 15 while (true) 16 { 17 //这里会阻塞当前线程,以等待连接 18 Socket socketTemp = serverSocket.Accept(); 19 20 //开启其他线程处理数据 21 ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveAndSend);//这里传入的方法必须是静态 22 new Thread(pts).Start(socketTemp); 23 } 24 25 } 26 27 /// <summary> 28 /// socket循环读取和发送的方法,建议用于多线程异步处理 29 /// </summary> 30 /// <param name="socketTemp">单用户Socket对象</param> 31 private static void ReceiveAndSend(object socketTemp) 32 { 33 Socket socket = (Socket)socketTemp; 34 IPEndPoint ipep = ((IPEndPoint)(socket.RemoteEndPoint)); 35 string ip = ipep.Address.ToString();//获得对方ip 36 string port = ipep.Port.ToString();//获得对方端口 37 byte[] buffer = new byte[1024]; 38 39 while (true)//循环接收和发送 40 { 41 //接收并显示 42 string result=""; 43 bool isReceiveMsgSuccess = ReceiveMsg(socket, ref result); 44 if (isReceiveMsgSuccess) 45 { 46 Console.WriteLine(DateTime.Now.ToLongDateString()+" "+ DateTime.Now.ToLongTimeString()); 47 Console.WriteLine(ip + " _ " + port + ":" + result); 48 } 49 50 //回发 51 string sendBackStr = "服务端已接收:" + result; 52 SendMsg(socket, sendBackStr); 53 54 //socket.Shutdown(SocketShutdown.Both); 55 //socket.Close(); 56 //socket.Dispose(); 57 } 58 } 59 60 /// <summary> 61 /// 接收内容(如果失败,会释放socket) 62 /// </summary> 63 /// <param name="socket">接受内容的socket</param> 64 /// <param name="msg">输出字符串</param> 65 /// <returns>接收是否成功</returns> 66 private static bool ReceiveMsg(Socket socket,ref string msg) 67 { 68 try 69 { 70 int recNumber;//接收到的字节数量 71 byte[] recBytes = new byte[1024];//缓冲字节数组 72 recNumber = socket.Receive(recBytes);//接收行为 73 byte[] recBytesForShort = new byte[recNumber]; 74 Array.Copy(recBytes, recBytesForShort, recNumber);//拷贝 75 76 //显示 77 msg += Encoding.UTF8.GetString(recBytesForShort) + "\r\n"; 78 79 return true; 80 } 81 catch (Exception e) 82 { 83 socket.Close(); 84 85 return false; 86 } 87 88 } 89 90 /// <summary> 91 /// 发送内容(如果失败,会释放socket) 92 /// </summary> 93 /// <param name="socket">发送内容的socket</param> 94 /// <param name="msg">输入字符串</param> 95 /// <returns>接收是否成功</returns> 96 private static bool SendMsg(Socket socket, string msg) 97 { 98 try 99 { 100 socket.Send(Encoding.UTF8.GetBytes(msg)); 101 return true; 102 } 103 catch (Exception e) 104 { 105 socket.Close(); 106 return false; 107 } 108 }
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式