C#Socket通信基础方法知识整理

 一、IP地址操作类

    1、IPAddress

    a、在该类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类,方法如下:

    IPAddress address =IPAddress.Parse(“192.168.0.1”);

    b、IPAddress提供4个只读字段

    Any 用于代表本地系统可用的任何IP地址

    Broadcase 用于代表本地网络的IP广播地址

   Loopback 用于代表系统的回送地址

None 用于代表系统上没有网络接口

    其中IPAddress.Any最常用可以用来表示本机上所有的IP地址,这对于socket服务进行侦听时,最方便使用,不用对每个IP进行侦听了。

    而IPAddress.Broadcase可用来UDP的IP广播,这些具体讲socket时再详细介绍。

    2、IPEndPoint

    我们可以通过二种构造方法来创建IPEndPoint类:

    a、IPEndPoint(long address, int port)

   b、IPEndPoint(IPAddressaddress, int port)

    四个属性:Address 、AddressFamily、 Port 、MaxPort、MinPort

这些应该从名字上就很好理解,不再一一介绍。IPEndPoint其实就是一个IP地址和端口的绑定,可以代表一个服务,用来Socket通讯。二、DNS相关类

    DNS类有四个静态方法,来获取主机DNS相关信息,

    1、GetHostName()

    通过Dns.GetHostName()可以获得本地计算机的主机名

    2、GetHostByName()

    根据主机名称,返回一个IPHostEntry 对象:

   IPHostEntry GetHostByName(string hostName)

    其中IPHostEntry把一个DNS主机名与一个别名和IP地址的数组相关联,包含三个属性: AddressList:一个IPAddress对象的 数组 、Aliases:一个字符串对象数组、HostName:一个用于主机名的字符串对象

    3、GetHostByAddress()

    类似于GetHostByName(),只不过这里的参数是IP地址,而不是主机名,也返回一个IPHostEntry对象。

   IPHostEntry GetHostByAddress(IPAddress address)

   IPHostEntry GetHostByAddress(string address)

    4、Resolve()

    当我们不知道输入的远程主机的地址是哪种格式时(主机名或IP地址),用以上的二种方法来实现,我们可能还要通过判断客户输入的格式,才能正确使用,但Dns类提供

    一更简单的方法Resolve(),该方法可以接受或者是主机名格式或者是IP地址格式的任何一种地址,并返回IPHostEntry对象。

三、Socket编程

    对于Socket编程我们通常按照下面的步骤来进行:

    A、服务端

    1、创建IPEndPoint实例,用于Socket侦听时绑定

   IPEndPoint ipep = newIPEndPoint(IPAddress.Any, 6001);

    2、创建套接字实例

   mServerSocket = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    3、将套接字和IPEndPoint绑定

   mServerSocket.Bind(ipep);

    4、设置套接字为收听模式

   mServerSocket.Listen(10);

   5、接收客户端的连接并开启一个线程来接收数据

   while (true)           

   {

   try   

   {                   

   mClientSocket = mServerSocket.Accept();                   

   mClientThread = newThread(ReceiveData);                   

    mClientThread.Start();               

    }

    catch (Exception e)               

    {                   

    Console.WriteLine("Socket通讯出现异常错误:" + e.Message);               }           

    }

    其中,接受数据的方法ReceiveData()定义如下:

///<summary>///接受客户端数据的方法       

///</summary>///<returns></returns>

private staticvoid ReceiveData()       

{           

bool keepActive =true; //客户端Socket           

Socket mSocket =mClientSocket; //缓冲区大小           

Byte[] buffer =new Byte[1024]; //获取客户端信息           

IPEndPointClientipep = (IPEndPoint)mClientSocket.RemoteEndPoint; //输出客户端信息          

Console.WriteLine("[系统]:客户端" + Clientipep.Address +":" + Clientipep.Port + "加入连接");//等待客户端响应            while (keepActive)

 {

try

{

//获取数据大小

mLength =mSocket.Available;

//接受数据

 mSocket.Receive(buffer, 0, mLength,SocketFlags.None); //判断数据是否读取完毕                   

if (mLength == 0)continue;               

}               

catch (Exceptione)               

{                   

Console.WriteLine("读取数据出现异常:" + e.Message);               

}                //输出客户端消息                Console.WriteLine("[客户端]:"+ Encoding.Unicode.GetString(buffer).ToString());

 发送数据的方法代码如下:

//向客户端发送数据               

byte[] data = newbyte[1024];               

data =Encoding.Unicode.GetBytes("服务器收到!");               

mSocket.Send(data,data.Length, SocketFlags.None);

    B、客户端

    和服务器端类似,直接给出代码:

IPEndPoint ipep =new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001);           

mClientSocket =new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);            

try           

{               

mClientSocket.Connect(ipep);               

if(mClientSocket.Connected)               

{                  

 Console.WriteLine("[系统]:客户端已连接到服务器端,开始向服务器发送数据");                  

 Console.WriteLine("[客户端]:我是客户端" + ipep.Address + ":"+ ipep.Port + "我正在向服务器发送数据");                    //向服务器发送数据                   

byte[] data = newbyte[1024];                   

data =Encoding.Unicode.GetBytes("你好,服务器端,我是客户端");                   

mClientSocket.Send(data,data.Length, SocketFlags.None); //提示用户等待服务器响应                  

 Console.WriteLine("[系统]:等待服务器响应......");                   

while (true)                   

{                       

mLength = 0;                       

try                       

{                           

mLength =mClientSocket.Available;                          

 mClientSocket.Receive(mData, mLength,SocketFlags.None);                           

if (mLength ==0)                               

continue;                        

}                       

catch (Exceptione)                       

{                           

Console.Write("读取服务器数据失败:" + e.Message);                          

 return;                       

}                       

Console.WriteLine("[服务器]:"+Encoding.Unicode.GetString(mData).Substring(0,mLength).ToString());                   

}               

}           

}           

catch (Exceptione)           

{              

 Console.WriteLine("连接到服务器失败:" + e.Message);               

return;           

}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值