一、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;
}