Socket网络通信

网络编程

       
使用C#进展网络编程时,寻常都急需用到System.Net命名空间、System.Net.Sockets命名空间和System.Net.Mail命名空间;

1.
System.Net命名空间:
为当下互连网上利用的多样商谈提供了简要的编程接口。

  1. DNS类:DNS是一个静态类,它从Internet域名系统(DNS)检索有关特定主机的信息,在IPHostEntry类的实例中回到来自DNS查询的主机新闻。(GetHostName()找到地点系统的主机名,然后再用GetHostByName()找到主机的IP地址)
  2. IPAddress类:包罗统计机在IP网络上的地点,首要用以提供网际协议(IP)地址。
  3. IPEndPoint类包罗应用程序连接到主机上的服务所要求的主机和本土或远程端口音信。主要用于将网络端点表示为IP地址和端口号。
  4. WebClient类:提供向URL标识的其他地点、Intranet或Internet资源发送数据以及从那一个资源接收数据的公物艺术。
  5. WebRequest类:.Net
    Framework的哀求/响应模型的抽象基类,用于访问Internet数据。使用该请求/响应模型的应用程序可以用协议不可见的方法从Internet请求数据。

2. System.Net.Sockets命名空间

       
主要提供制作Sockets互连网应用程序的连带类,其中Socket类,TcpClient类、TcpListener类和UdpClient类较为常用。在.NET框架下支付时,直接运用System.Net.Sockets名称空间中的Socket类编程较为复杂,而应用层的类TcpClient、TcpListener
和 UdpClient为 Socket
通讯提供了更简便易行、对用户更和谐的接口。它们和Socket类之间的那种层次关系如图

图片 1

(1)Socket类:根本用来管理总是(将应用程序与端口连接起来,端口是一台微机的数目都由此此一而再互联网,
Socket是根据流套接字协议(TCP协议)/基于数据报套接字协议(UDP协议)最为通用的API。),完结Berkeley通讯端套接字接口,同时它还定义了绑定、连接互连网端点及传输数据所需的种种法子。

    1. void Bind(IPEndPoint
      localEP):绑定地址,使Socket与一个本土终节点相关联。
    2. Void Connect(IPEndPoint ip):建立连接
    3. Void Listen(int backlog):将Socket置于侦听状态,
      backlog最多可连接数。
    4. Int Receive(byte[] buffer):接收数据
    5. Int Receive (byte[] buffer,ref IPEndPoint
      ip):从指定地点接收数据
    6. Int Send(byte[] buffer):发送数据
    7. Int Send To(byte[] buffer,ref IPEndPoint
      remoteIP):向指定地点发送数据
    8. Void Shutdown(SocketShutdown
      how):关闭套接字,how指定不在允许实施的操作

注:使用accept函数建立新的连日时,并不是运用原来的Socket举行通讯,而是再次来到一个新的Socket套接字举行再三再四通讯。原来的Socket继续进入监听状态,等待别人的一而再要求。

(2)TcpClient类:依据Socket类打造,用于在一道阻止形式下通过网络来延续,发送,接收数据。

       
那是它可以以更高的用空想来欺骗别人程度提供TCP服务的底蕴。显示在互连网数据的发送和经受地点,是TcpClient使用NetworkStream网络流处理技术,使得它读写多少进一步惠及直观。TcpClient类专为客户端设计,它为
TCP 互联网服务提供客户端连接。

(3)NetworkStream网络流:可以被视为一个数据通道,架设在数据来源端(客户Client)和接收端(服务Server)之间,通过TcpClient.GetStream方法,重临用于发送和接收数据的网络流NetworkStream。

       
注:要创设NetworkStream必须提供连接的Socket.默许情形下关闭NetworkStream并不会倒闭所提供的Socket.即便要关闭Socket权限,则必须将ownsSocket构造函数参数的值指定为true.而后的数据读取及写入均指向这些通道来开展。不匡助对互联网流的擅自走访。

以身作则如下:通过以下办法得到NetworkStream互联网流之后,就可以动用专业流读写方法Write和Read来发送和接受多少了。

1 TcpClient tcpClient = new TcpClient();             //创建TcpClient对象实例
2 tcpClient.Connect("www.baidu.com",4088);         //尝试与远程主机相连
3 NetworkStream stream=tcpClient.GetStream();      //获取网络传输流
  1. BeginRead():从NetworkStream初叶一步读取
  2. BeginWrite():开首向流异步写入
  3. Close():关闭NetworkStream
  4. EndRead():处理异步读取截至
  5. EndWrite():处理异步写入停止
  6. Flush():刷新流中的数码
  7. Read():从流中读取
  8. ReadByte():从流中读取一个字节,并将流内的岗位向前推进一个字节。到达最后,重回-1。
  9. Write():将数据写入NetworkStream
  10. WriteByte():将一个字节写入流内的当前职责,并将流内的岗位向前推进一个字节。

Server:获取基础互联网Socket

  1. AcceptSocket/AcceptTcpClient:接受挂起的屡次三番请求
  2. BeginAcceptSocket/BeginAcceptTcpClient:发轫一个异步操作来接受一个传诵的总是尝试
  3. Start:起首侦听传入的连接请求
  4. Stop:关闭侦听

Client客户端连接侦听器的三种办法:

(1)成立一个TcpClient,并调用3个可用Connect方法之一。

(2)使用远程主机的主机名和端口号创造TcpClient,此构造函数将电动尝试一个总是。

  1. Client:获取或安装基础Socket
  2. ReceiveBufferSize:获取或安装接收缓冲区的分寸
  3. SendBufferSize:获取或安装发送缓冲区的深浅
  4. BeginConnect方法:开首一个对长途主机连接的异步请求
  5. Close:释放TcpClient 实例,不闭馆基础连接
  6. Connect:使用指定的主机名和端口号将客户端连接到TCP主机
  7. GetStream:重返用于发送和接收数据的NetworkStream

创设连接TCPClient连接情势:

(1)成立一个TcpClient,并调用五个可用的Connect()方法之一。

  1. void
    Connect(IPEndPoint):使用指定的长途网络节点将客户端连接到远程TCP主机。

    1 IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList(0);//获取IP地址
    2 IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 60000);//设置端口
    3 TcpClient tcpClientA = new TcpClient(ipLocalEndPoint);//创建客户端
    

 

 2. void
Connect(IPAddress,int):使用指定的IP地址和端口号将客户端连接到TcpClient主机。

 3. void Connect(string,int):将客户端连接到指定主机上的指定端口。

 1
TcpClient tcpClientB = new
TcpClient(“www.baidu.com”, 8888);//创制客户端 

(2)  使用远程主机的主机名和端口号创立TcpClient。

1 TcpClient tcpClient = new TcpClient();//创建TcpClient对象实例
2 tcpClient.Connect("www.baidu.com",8080);//建立连接

       
注:要发送和承受多少,先拔取GetStream()方法来收获一个NetworkStream,再调用NetworkStream的Write()和Read()方法与长途主机之间发送和接收数据。最终动用Close()方法释放与TcpClient()关联的兼具资源。

TcpListner:用以阻止同步格局下侦听和承受传入的接连请求。

       
可应用TcpClient类或Socket类来连接TcpListener,并且可以采纳IPEndPoint、本地IP地址及端口号来创立TcpListener实例对象。

       
.Net中的TcpListener主要成效是监视TCP端口上客户端的伸手,通过绑定本机IP地址和呼应端口创设TcpListener对象实例,并由Start方法启动侦听;当TcpListener侦听到用户端的接连后,通过AcceptTcpClient方法接受传入的连接请求并创办TcpClient以拍卖请求,或者经过AcceptSocket方法接受传入的一连请求并创设Socket以拍卖请求。

(1)创克服务器端:

 1 //建立TCP监听器TcpListener对象。
 2  TcpListener tl=new TcpListener(端口号);
 3 //启动监听器
 4 tl.Start();
 5 //用监听器获取连接进来的套接字(Socket)
 6 Socket s=myList.AcceptSocket();
 7 //通过Socket的Receive方法获取客户端发送的数据
 8 byte [] result=new byte[1024];
 9 int k=s.Receive(result);
10 //通过Socket的Send方法向客户端发送数据
11 byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
12 s.Send(st);
13 //在通讯结束后,需要释放资源结束监听
14 s.Close();
15 tl.Stop();

Socket建立服务器:开端化监听Socket   接受新的客户端连接   收发数据  
关闭连接

1 socketServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建Socket 客户端
2 //Socket绑定本地端口监听客户端连接;
3 Socket.Bind(端口号);
4 Socket.Listen();
5 socket.Receive();//创建连接的客户端的Socket并开启线程接收数据;
6 socket.Send();//发送数据
7 socket.Close();//关闭连接

TcpClient创设客户端:

 1 //建立TCP客户端TcpClient对象。
 2 TcpClient tcpclnt = new TcpClient();
 3 //连接服务器
 4 tcpclnt.Connect(IP地址字符串,端口号);
 5 //获得客户端网络传输 流
 6 Stream stm =tcpclnt.GetStream();
 7 //通过Stream的Write方法向服务器端发送的数据
 8 //通过Stream的Read方法读取服务器段发来的数据
 9 //在通讯结束后,需要释放资源,结束和服务器的连接
10 tcpclnt.Close();

TCP与UDP的区别

  1. TCP是面向连接的劳动、UDP是面向无连接服务
  2. TCP是独具差错控制的,而UDP没有缺少可依赖性
  3. TCP的传导是板上钉钉的,UDP是无序的
  4. UDP的实时性更好,有简短,快速、占用资源少的亮点。
  5. UDP传输限定在64KB之内,Tcp一旦确立连接,就足以按统一的格式传输多量的数额。

行使UdpClient类完成UDP协议编程

       
 由于UDP协议并不须要进行规定的一连,程序中可以不要求考虑连接和部分老大的破获工作。在稍微对数码安全性需求不是很高的处境下利用UDP协议。

       
在System.Net.Sockets命名空间下的UdpClient类,提供更直观的不难使用的属性和措施,从而下降UDP编程的难度。使用UdpClient时,连接的客户端必要头阵送一个信息给服务器,服务器才能和客户端通讯。

UdpClient类的构造函数有以下三种格式:

1 UdpClient();
2 UdpClient(int port);
3 UdpClient(IPEndPoint iep);
4 UdpClient(string remoteHost,int port);

利用Socket编写UdpClient

1 Socket udpSocket;//创建Socket
2 udpSocket.Bind(IPAddress,IPEndPoint);//把Socket绑定本地IP和端口号
3 //开启线程接收信息:先保存接到信息的端口号,使用ReceiveFrom发送信息
4 EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
5 EndPoint point = (EndPoint)IPEndPoint;
6 //发送信息:使用EndPoint创建发送目标的IP和端口号;
7 //关闭线程和Socket

利用UDPClient编程

 1 //建立UDP客户端UdpClient对象。
 2 UdpClient uc=new UdpClient(端口号);
 3 //连接对方远程主机
 4 uc.Connect(对方IP地址,对方远程主机的端口号);
 5 //开启线程,通过uc的Receive方法获取远程主机发送来的数据
 6 IPEndPoint ip=new IPEndPoint(IPAddress.Any,0);
 7 byte[] b=uc.Receive(ref ip);
 8 //通过uc的Send方法向远程主机发送数据
 9 byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
10 uc.Send(st);
11 //在通讯结束后,需要释放资源
12 uc.Close();

 

相关文章