網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
摘要
之所以要進(jìn)行Socket套接字通信庫(kù)封裝,主要是直接使用套接字進(jìn)行網(wǎng)絡(luò)通信編程相對(duì)復(fù)雜,特別對(duì)于初學(xué)者而言。實(shí)際上微軟從.net 2.0開(kāi)始已經(jīng)提供了TCP、UDP通信高級(jí)封裝類如下:
TcpListener TcpClient UdpClient
微軟從.net 4.0開(kāi)始提供基于Task任務(wù)的異步通信接口。而直接使用socket封裝庫(kù),很多socket本身的細(xì)節(jié)沒(méi)辦法自行控制,本文目就是提供一種socket的封裝供參考。文中展示部分封裝了TCP通信庫(kù),UDP封裝也可觸類旁通:
CusTcpListener CusTcpClient
代碼
using System; using System.Text; using System.Net.Sockets; using System.Net; namespace NetDemo { // 網(wǎng)絡(luò)操作相關(guān)的類 public class InternetProHelper { // 檢查設(shè)置的端口號(hào)是否正確,并返回正確的端口號(hào),無(wú)效端口號(hào)返回-1 public static int GetNetPort(string NetPort) { //聲明返回的正確端口號(hào) int resPort = -1; //檢測(cè)端口號(hào) try { //傳入的端口號(hào)為空則拋出異常 if (NetPort == "") { throw new Exception("端口號(hào)不能為空!"); } //檢測(cè)端口范圍 if ((Convert.ToInt32(NetPort) < ushort.MinValue) || (Convert.ToInt32(NetPort) > ushort.MaxValue)) { throw new Exception("端口號(hào)范圍無(wú)效!"); } //為端口號(hào)賦值 resPort = Convert.ToInt32(NetPort); } catch (Exception ex) { string errMessage = ex.Message; } return resPort; } public static IPAddress StringToIPAddress(string NetIP) { // 將字符串形式的IP地址轉(zhuǎn)換成IPAddress對(duì)象 return IPAddress.Parse(NetIP); } public static string LocalHostName { // 獲取本機(jī)的計(jì)算機(jī)名 get { return Dns.GetHostName(); } } public static string LANIP { // 獲取本機(jī)的局域網(wǎng)IP get { //獲取本機(jī)的IP列表,IP列表中的第一項(xiàng)是局域網(wǎng)IP,第二項(xiàng)是廣域網(wǎng)IP IPAddress[] IPaddrList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //如果本機(jī)IP列表為空,則返回空字符串 if (IPaddrList.Length < 1) { return ""; } //返回本機(jī)的局域網(wǎng)IP return IPaddrList[0].ToString(); } } public static string GetClientIP(Socket clientSocket) { // 獲取遠(yuǎn)程客戶機(jī)的IP地址 IPEndPoint client = (IPEndPoint)clientSocket.RemoteEndPoint;//客戶端的NetSocket對(duì)象 return client.Address.ToString(); } public static IPEndPoint CreateIPEndPoint(string NetIP, int NetPort) { // 創(chuàng)建一個(gè)IPEndPoint對(duì)象 IPAddress ipAddress = StringToIPAddress(NetIP); return new IPEndPoint(ipAddress, NetPort); } public static TcpListener CreateTcpListener() { //創(chuàng)建一個(gè)自動(dòng)分配的網(wǎng)絡(luò)節(jié)點(diǎn) IPAddress ipAddress = IPAddress.Any; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0); return new TcpListener(localEndPoint); } public static TcpListener CreateTcpListener(string NetIP, int NetPort) { //創(chuàng)建一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn) IPAddress ipAddress = StringToIPAddress(NetIP); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, NetPort); return new TcpListener(localEndPoint); } public static Socket CreateTcpSocket() { // 創(chuàng)建一個(gè)基于TCP協(xié)議的Socket對(duì)象 return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } public static Socket CreateUdpSocket() { // 創(chuàng)建一個(gè)基于UDP協(xié)議的Socket對(duì)象 return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); } public static IPEndPoint GetLocalPoint(TcpListener tcpListener) { // 獲取TcpListener對(duì)象的本地終結(jié)點(diǎn) return (IPEndPoint)tcpListener.LocalEndpoint; } public static string GetLocalPoint_IP(TcpListener tcpListener) { // 獲取TcpListener對(duì)象的本地終結(jié)點(diǎn)的IP地址 IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Address.ToString(); } public static int GetLocalPoint_Port(TcpListener tcpListener) { // 獲取TcpListener對(duì)象的本地終結(jié)點(diǎn)的端口號(hào) IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint; return localEndPoint.Port; } public static IPEndPoint GetLocalPoint(Socket NetSocket) { // 獲取Socket對(duì)象的本地終結(jié)點(diǎn) return (IPEndPoint)NetSocket.LocalEndPoint; } public static string GetLocalPoint_IP(Socket NetSocket) { // 獲取Socket對(duì)象的本地終結(jié)點(diǎn)的IP地址 IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint; return localEndPoint.Address.ToString(); } public static int GetLocalPoint_Port(Socket NetSocket) { // 獲取Socket對(duì)象的本地終結(jié)點(diǎn)的端口號(hào) IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint; return localEndPoint.Port; } public static void BindEndPoint(Socket NetSocket, IPEndPoint endPoint) { // 綁定終結(jié)點(diǎn) if (!NetSocket.IsBound) { NetSocket.Bind(endPoint); } } public static void BindEndPoint(Socket NetSocket, string NetIP, int NetPort) { //創(chuàng)建終結(jié)點(diǎn) IPEndPoint endPoint = CreateIPEndPoint(NetIP, NetPort); //綁定終結(jié)點(diǎn) if (!NetSocket.IsBound) { NetSocket.Bind(endPoint); } } public static void StartListen(Socket NetSocket, int NetPort) { //創(chuàng)建本地終結(jié)點(diǎn) IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort); //綁定到本地終結(jié)點(diǎn) BindEndPoint(NetSocket, localPoint); //開(kāi)始監(jiān)聽(tīng) NetSocket.Listen(200); } public static void StartListen(Socket NetSocket, int NetPort, int maxConnection) { //創(chuàng)建本地終結(jié)點(diǎn) IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort); //綁定到本地終結(jié)點(diǎn) BindEndPoint(NetSocket, localPoint); //開(kāi)始監(jiān)聽(tīng) NetSocket.Listen(maxConnection); } public static void StartListen(Socket NetSocket, string NetIP, int NetPort, int maxConnection) { //綁定到本地終結(jié)點(diǎn) BindEndPoint(NetSocket, NetIP, NetPort); //開(kāi)始監(jiān)聽(tīng) NetSocket.Listen(maxConnection); } public static bool Connect(Socket NetSocket, string NetIP, int NetPort) { // 連接到基于TCP協(xié)議的服務(wù)器,連接成功返回true,否則返回false try { //連接服務(wù)器 NetSocket.Connect(NetIP, NetPort); //檢測(cè)連接狀態(tài) return NetSocket.Poll(-1, SelectMode.SelectWrite); } catch (SocketException ex) { throw new Exception(ex.Message); } } // 以同步方式向指定的Socket對(duì)象發(fā)送消息 public static void SendMsg(Socket NetSocket, byte[] dataStr) { //發(fā)送消息 NetSocket.Send(dataStr, dataStr.Length, SocketFlags.None); } // 使用UTF8編碼格式以同步方式向指定的Socket對(duì)象發(fā)送消息 public static void SendMsg(Socket NetSocket, string dataStr) { //將字符串消息轉(zhuǎn)換成字符數(shù)組 byte[] NetBuf = System.Text.Encoding.UTF8.GetBytes(dataStr); //發(fā)送消息 NetSocket.Send(NetBuf, NetBuf.Length, SocketFlags.None); } // 以同步方式接收消息 public static void ReceiveMsg(Socket NetSocket, byte[] NetBuf) { NetSocket.Receive(NetBuf); } // 以同步方式接收消息 public static string ReceiveMsg(Socket NetSocket) { //定義接收緩沖區(qū) byte[] NetBuf = new byte[10000]; //接收數(shù)據(jù),獲取接收到的字節(jié)數(shù) int RecvNum = NetSocket.Receive(NetBuf); //定義臨時(shí)緩沖區(qū) byte[] DataBuf = new byte[RecvNum]; //將接收到的數(shù)據(jù)寫(xiě)入臨時(shí)緩沖區(qū) Buffer.BlockCopy(NetBuf, 0, DataBuf, 0, RecvNum); //對(duì)DataBuf進(jìn)行處理 return Convert.ToString(DataBuf); } // 關(guān)閉基于Tcp協(xié)議的Socket對(duì)象 public static void Close(Socket NetSocket) { try { //禁止Socket對(duì)象接收和發(fā)送數(shù)據(jù) NetSocket.Shutdown(SocketShutdown.Both); } catch (SocketException ex) { throw ex; } finally { //關(guān)閉Socket對(duì)象 NetSocket.Close(); } } } }
總結(jié)
原文鏈接:https://blog.csdn.net/baobingji/article/details/123777728
相關(guān)推薦
- 2022-08-05 C++詳細(xì)講解模擬實(shí)現(xiàn)位圖和布隆過(guò)濾器的方法_C 語(yǔ)言
- 2022-03-17 C#表達(dá)式樹(shù)Expression基礎(chǔ)講解_C#教程
- 2023-02-06 C語(yǔ)言預(yù)處理器使用方法講解_C 語(yǔ)言
- 2022-03-20 關(guān)于數(shù)據(jù)庫(kù)系統(tǒng)的概述_數(shù)據(jù)庫(kù)其它
- 2023-11-20 python獲取當(dāng)前路徑所有文件
- 2022-05-13 Django-跨域問(wèn)題Csrf
- 2022-03-18 docker?創(chuàng)建容器時(shí)指定容器ip的實(shí)現(xiàn)示例_docker
- 2022-12-29 淺析Python是如何實(shí)現(xiàn)集合的_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支