C#基于Socket的网络通信类你了解吗

目录
  • 摘要
  • 代码
  • 总结

摘要

之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言。实际上微软从.net 2.0开始已经提供了TCP、UDP通信高级封装类如下:

TcpListener
TcpClient
UdpClient

微软从.net 4.0开始提供基于Task任务的异步通信接口。而直接使用socket封装库,很多socket本身的细节没办法自行控制,本文目就是提供一种socket的封装供参考。文中展示部分封装了TCP通信库,UDP封装也可触类旁通:

CusTcpListener
CusTcpClient

代码

using System;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace NetDemo
{
    // 网络操作相关的类
    public class InternetProHelper
    {

       // 检查设置的端口号是否正确,并返回正确的端口号,无效端口号返回-1
        public static int GetNetPort(string NetPort)
        {
            //声明返回的正确端口号
            int resPort = -1;

            //检测端口号
            try
            {
                //传入的端口号为空则抛出异常
                if (NetPort == "")
                {
                    throw new Exception("端口号不能为空!");
                }

                //检测端口范围
                if ((Convert.ToInt32(NetPort) < ushort.MinValue) || (Convert.ToInt32(NetPort) > ushort.MaxValue))
                {
                    throw new Exception("端口号范围无效!");
                }

                //为端口号赋值
                resPort = Convert.ToInt32(NetPort);
            }
            catch (Exception ex)
            {
                string errMessage = ex.Message;
            }
            return resPort;
        }

        public static IPAddress StringToIPAddress(string NetIP)
        {
            // 将字符串形式的IP地址转换成IPAddress对象
            return IPAddress.Parse(NetIP);
        }

        public static string LocalHostName
        {
            // 获取本机的计算机名
            get
            {
                return Dns.GetHostName();
            }
        }

        public static string LANIP
        {
            // 获取本机的局域网IP
            get
            {
                //获取本机的IP列表,IP列表中的第一项是局域网IP,第二项是广域网IP
                IPAddress[] IPaddrList = Dns.GetHostEntry(Dns.GetHostName()).AddressList;

                //如果本机IP列表为空,则返回空字符串
                if (IPaddrList.Length < 1)
                {
                    return "";
                }

                //返回本机的局域网IP
                return IPaddrList[0].ToString();
            }
        }

        public static string GetClientIP(Socket clientSocket)
        {
            // 获取远程客户机的IP地址
            IPEndPoint client = (IPEndPoint)clientSocket.RemoteEndPoint;//客户端的NetSocket对象
            return client.Address.ToString();
        }

        public static IPEndPoint CreateIPEndPoint(string NetIP, int NetPort)
        {
            // 创建一个IPEndPoint对象
            IPAddress ipAddress = StringToIPAddress(NetIP);
            return new IPEndPoint(ipAddress, NetPort);
        }

        public static TcpListener CreateTcpListener()
        {
            //创建一个自动分配的网络节点
            IPAddress ipAddress = IPAddress.Any;
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 0);

            return new TcpListener(localEndPoint);
        }
        public static TcpListener CreateTcpListener(string NetIP, int NetPort)
        {
            //创建一个网络节点
            IPAddress ipAddress = StringToIPAddress(NetIP);
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, NetPort);

            return new TcpListener(localEndPoint);
        }

        public static Socket CreateTcpSocket()
        {
            // 创建一个基于TCP协议的Socket对象
            return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        public static Socket CreateUdpSocket()
        {
            // 创建一个基于UDP协议的Socket对象
            return new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        }

        public static IPEndPoint GetLocalPoint(TcpListener tcpListener)
        {
            // 获取TcpListener对象的本地终结点
            return (IPEndPoint)tcpListener.LocalEndpoint;
        }

        public static string GetLocalPoint_IP(TcpListener tcpListener)
        {
            // 获取TcpListener对象的本地终结点的IP地址
            IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint;
            return localEndPoint.Address.ToString();
        }

        public static int GetLocalPoint_Port(TcpListener tcpListener)
        {
            // 获取TcpListener对象的本地终结点的端口号
            IPEndPoint localEndPoint = (IPEndPoint)tcpListener.LocalEndpoint;
            return localEndPoint.Port;
        }

        public static IPEndPoint GetLocalPoint(Socket NetSocket)
        {
            // 获取Socket对象的本地终结点
            return (IPEndPoint)NetSocket.LocalEndPoint;
        }

        public static string GetLocalPoint_IP(Socket NetSocket)
        {
            // 获取Socket对象的本地终结点的IP地址
            IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint;
            return localEndPoint.Address.ToString();
        }

        public static int GetLocalPoint_Port(Socket NetSocket)
        {
            // 获取Socket对象的本地终结点的端口号
            IPEndPoint localEndPoint = (IPEndPoint)NetSocket.LocalEndPoint;
            return localEndPoint.Port;
        }

        public static void BindEndPoint(Socket NetSocket, IPEndPoint endPoint)
        {
            // 绑定终结点
            if (!NetSocket.IsBound)
            {
                NetSocket.Bind(endPoint);
            }
        }

        public static void BindEndPoint(Socket NetSocket, string NetIP, int NetPort)
        {
            //创建终结点
            IPEndPoint endPoint = CreateIPEndPoint(NetIP, NetPort);

            //绑定终结点
            if (!NetSocket.IsBound)
            {
                NetSocket.Bind(endPoint);
            }
        }

        public static void StartListen(Socket NetSocket, int NetPort)
        {
            //创建本地终结点
            IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort);

            //绑定到本地终结点
            BindEndPoint(NetSocket, localPoint);

            //开始监听
            NetSocket.Listen(200);
        }

        public static void StartListen(Socket NetSocket, int NetPort, int maxConnection)
        {
            //创建本地终结点
            IPEndPoint localPoint = CreateIPEndPoint(InternetProHelper.LocalHostName, NetPort);

            //绑定到本地终结点
            BindEndPoint(NetSocket, localPoint);

            //开始监听
            NetSocket.Listen(maxConnection);
        }

        public static void StartListen(Socket NetSocket, string NetIP, int NetPort, int maxConnection)
        {
            //绑定到本地终结点
            BindEndPoint(NetSocket, NetIP, NetPort);

            //开始监听
            NetSocket.Listen(maxConnection);
        }

        public static bool Connect(Socket NetSocket, string NetIP, int NetPort)
        {
            // 连接到基于TCP协议的服务器,连接成功返回true,否则返回false
            try
            {
                //连接服务器
                NetSocket.Connect(NetIP, NetPort);

                //检测连接状态
                return NetSocket.Poll(-1, SelectMode.SelectWrite);
            }
            catch (SocketException ex)
            {
                throw new Exception(ex.Message);

            }
        }

        // 以同步方式向指定的Socket对象发送消息
        public static void SendMsg(Socket NetSocket, byte[] dataStr)
        {
            //发送消息
            NetSocket.Send(dataStr, dataStr.Length, SocketFlags.None);
        }

        // 使用UTF8编码格式以同步方式向指定的Socket对象发送消息
        public static void SendMsg(Socket NetSocket, string dataStr)
        {
            //将字符串消息转换成字符数组
            byte[] NetBuf = System.Text.Encoding.UTF8.GetBytes(dataStr);

            //发送消息
            NetSocket.Send(NetBuf, NetBuf.Length, SocketFlags.None);
        }

        // 以同步方式接收消息
        public static void ReceiveMsg(Socket NetSocket, byte[] NetBuf)
        {
            NetSocket.Receive(NetBuf);
        }

        // 以同步方式接收消息
        public static string ReceiveMsg(Socket NetSocket)
        {
            //定义接收缓冲区
            byte[] NetBuf = new byte[10000];
            //接收数据,获取接收到的字节数
            int RecvNum = NetSocket.Receive(NetBuf);

            //定义临时缓冲区
            byte[] DataBuf = new byte[RecvNum];
            //将接收到的数据写入临时缓冲区
            Buffer.BlockCopy(NetBuf, 0, DataBuf, 0, RecvNum);
            //对DataBuf进行处理
            return Convert.ToString(DataBuf);
        }

        // 关闭基于Tcp协议的Socket对象
        public static void Close(Socket NetSocket)
        {
            try
            {
                //禁止Socket对象接收和发送数据
                NetSocket.Shutdown(SocketShutdown.Both);
            }
            catch (SocketException ex)
            {
                throw ex;
            }
            finally
            {
                //关闭Socket对象
                NetSocket.Close();
            }
        }

    }
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C#基于Socket的TCP通信实现聊天室案例

    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 一.Socket(套接字)通信概念 套接字(socket)是通信的基石,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口. 应用层通过传输层进行数据

  • C#网络编程之Socket编程

    目录 一:什么是SOCKET 套接字分类 二:SOCKET相关概念 1.端口 2.协议 2.1 TCP: 2.2 UDP 三:socket一般应用模式: 四:SOCKET通信基本流程图: 服务器端: 客户端: 五:示例程序 一:什么是SOCKET socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的).socket非常类似于电话插座.以一个电话网为例:电话的通话双方相当于相互通信的2个

  • C#使用Socket实现本地多人聊天室

    本文实例为大家分享了C#使用Socket实现本地多人聊天室的具体代码,供大家参考,具体内容如下 [脚本一:Server端] 使用本机地址:127.0.0.1 完整代码 using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;   namespace ConsoleApp1 {     p

  • C#基于Socket实现多人聊天功能

    本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下 服务器 服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户. 代码: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace ChatRoomService

  • C#基于Socket实现简单聊天室功能

    因为这段时间在学习Socket,所以就试着写了一个简单的聊天室.主要分为服务器端和多个客户端.利用服务器端作数据中转站,实现消息群发. 1.服务器端有两个类: using System.Collections.Generic; using System.Net; using System.Net.Sockets; namespace 聊天室_Socket_TCP_服务器端 {     class Program     {         static List<Client> clients

  • C#基于Socket的网络通信类你了解吗

    目录 摘要 代码 总结 摘要 之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言.实际上微软从.net 2.0开始已经提供了TCP.UDP通信高级封装类如下: TcpListener TcpClient UdpClient 微软从.net 4.0开始提供基于Task任务的异步通信接口.而直接使用socket封装库,很多socket本身的细节没办法自行控制,本文目就是提供一种socket的封装供参考.文中展示部分封装了TCP通信库,UDP封装

  • 基于Socket的网络连接 Flex与.NET互操作(一)

    ActionScript 3.0提供了通过Socket连接的方式与服务器端通信.这点是超越传统B/S结构的重要特征.这样使得网络通信可以即时连接,避免了HTTP协议无状态连接的弊病.ActionScript 3.0使用XMLSocket类进行连接.需要注意的是使用XMLSocket类进行Socket连接时,不能自动穿过防火墙.要想穿过防火墙连接,则需要使用基于HTTP协议的RTMP协议. 通过查阅Adobe提供的API文档可以了解到,XMLSocket提供了四个公开方法: .XMLSocket(

  • 基于Socket类以及ServerSocket类的实例讲解

    Socket类 套接字是网络连接的端点,套接字使应用可以从网络中读取数据,可以向网络中写入数据.不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的. 为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的 IP 地址和端口号,在java中,套接字由java.net.Socket 表示. 要创建一个套接字,可以使用Socket类中众多构造函数中的一个.其中一个构造函数接收两个参数:主机号和端口号. public Socket (String hos

  • C#基于Socket套接字的网络通信封装

    本文为大家分享了C#基于Socket套接字的网络通信封装代码,供大家参考,具体内容如下 摘要 之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言.实际上微软从.net 2.0开始已经提供了TCP.UDP通信高级封装类如下: TcpListener TcpClient UdpClient 微软从.net 4.0开始提供基于Task任务的异步通信接口.而直接使用socket封装库,很多socket本身的细节没办法自行控制,本文目就是提供一种so

  • Java基于Socket实现网络编程实例详解

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

  • Java基于socket编程相关知识解析

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

  • Python实现socket库网络通信套接字

    Socket 套接字:通讯端点 简介 socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). Socket 是任何一种计算机网络通讯中最基础的内容.Socket通讯一般用户C/S结构系统的网络通讯. Socket 网络通讯是基于TCP(传输控制协议)或UDP(用户数据报协议)两种协议

  • Java基于Socket实现简单的多线程回显服务器功能示例

    本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能.分享给大家供大家参考,具体如下: 需要两个类,一个是EchoServer,代表服务器.另外一个是EchoServerClient,代表客户端.代码如下: package interview; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter

  • java基于socket传输zip文件功能示例

    本文实例讲述了java基于socket传输zip文件的方法.分享给大家供大家参考,具体如下: 服务器端程序: import java.io.*; import java.net.*; import java.io.BufferedInputStream; public class SocketServer { ServerSocket ss=null; Socket s=null; DataInputStream inStream=null; DataOutputStream outStream

  • Android基于socket实现的简单C/S聊天通信功能

    本文实例讲述了Android基于socket实现的简单C/S聊天通信功能.分享给大家供大家参考,具体如下: 主要想法:在客户端上发送一条信息,在后台开辟一个线程充当服务端,收到消息就立即回馈给客户端. 第一步:创建一个继续Activity的SocketClientActity类,包为com.pku.net 编写布局文件socketclient.xml,代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin

随机推荐