您的位置:首页 > 理论基础 > 计算机网络

C#网络编程-TcpClient、TcpListener、UdpClient

2012-05-17 10:06 597 查看
说到网络编程,就少不了要说说Socket。无论是在Linux系统中还是Windows系统中,都支持Socket编程。所谓的Socket就是一个套接字,由一个IP地址和一个端口确定。网络编程中一般支持面向连接和面向无连接两种,面向连接使用TCP协议,无连接使用UDP协议。下面两幅图描述面向连接和面向无连接的Socket通信过程。



图一:面向连接



图二:面向无连接

从图一中可以看出,要使用Socket实现通信需要的基本步骤。首先要实例化一个Socket对象,然后进行绑定。由于面向连接,服务器端需要一直监听是否有客户端尝试连接进来。客户端同样需要实例化Socket对象,尝试连接服务器,当服务器接受某客户端的连接请求时,连接建立,此时客户端和服务器断可以进行Send和Recieve数据。.netframework允许以这样的方式来使用Socket,同时提供TcpClient、TcpListener、UdpClient三个类来简化编程过程。下面给出这三个类的使用方法。

//TCPClient的第一种使用方法
//声明一个TCPClient对象,并自动绑定到本地地址和一个端口上
TcpClient test1 = new TcpClient();
//TCPClient对象试图连接到远程主机上的8080端口上
test1.Connect("www.baidu.com", 8080);

//TCPClient的第二种使用方法
//直接创建TCPClient对象,连接到远程主机上(本地自动分配随机端口)
TcpClient test2 = new TcpClient("www.baidu.com",8080);

//TCPClient的第三种使用方法
//自己指定本地地址和端口值(可以尝试制定非本地地址,以伪装自己发送数据包)
IPAddress ipa = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
IPEndPoint ipe = new IPEndPoint(ipa,9090);
//创建TCPClient对象,将其绑定到指定的本地地址和端口上
TcpClient test3 = new TcpClient(ipe);
//尝试连接到远程主机上
test3.Connect("www.baidu.com", 8080);

//TCPClient对象创建完,可以使用GetStream方法创建Stream类,进行收发数据
NetworkStream ns = test3.GetStream();
//写入数据
byte[] outStream = Encoding.ASCII.GetBytes("Testing");
ns.Write(outStream,0,outStream.Length);
//读取数据
byte[] inStream = new byte[1024];
ns.Read(inStream,0,inStream.Length);


TcpListener  listener= new TcpListener(9050);
//启动侦听
listener.Start();
//AcceptClient方法返回值是TcpClient类型
TcpClient client = listener.AcceptTcpClient();
//得到TCPClient对象后,可以像上一个例子中一样,使用GetStream方法,读写数据
NetworkStream ns = client.GetStream();
//写入数据
byte[] outStream = Encoding.ASCII.GetBytes("Testing");
ns.Write(outStream,0,outStream.Length);
//读取数据
byte[] inStream = new byte[1024];
ns.Read(inStream, 0, inStream.Length);
//各种关闭
ns.Close();
client.Close();
listener.Stop();


//创建UDPClient对象
UdpClient client = new UdpClient(8000);
//接受发送主机的IP地址信息
IPEndPoint remoteclient = new IPEndPoint(IPAddress.Any,0);
//Receive方法包含一个IPEndPoint,携带远程发送主机的IP地址信息
byte[] recv = client.Receive(ref remoteclient);
string data = Encoding.ASCII.GetString(recv);
Console.WriteLine("Data comes from : {0}",remoteclient.ToString());
Console.WriteLine("Data : {0}", data);
client.Close();

//UDPClient对象创建,发送数据
UdpClient client1 = new UdpClient(8001);
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.1.11"),8001);
byte[] sendMsg = Encoding.ASCII.GetBytes("Sending Messages");
client1.Send(sendMsg, sendMsg.Length, ipe);
client1.Close();


这样使用,可以方便编程,但对理解Socket实现过程没有好处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: