您的位置:首页 > 编程语言 > C#

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

2016-10-24 17:50 591 查看
 一、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,
c765
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;           
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息