标签:
什么是Socket
在基于Socket的网络编程中,你无需直接访问网络接口来发送或接收数据,而是通过Socket来实现程序与网络之间的数据交互。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
主机A(Host A)上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
使用C#进行Socket编程
.NET FrameWork中的System.Net.Sockets中提供了一系列Socket类,这些类封装了操作系统底层的Winsocket API,使用起来非常方便。
无论采用哪种编程语言进行网络编程,都会涉及到一些通用的概念,如IP地址、端口。IP地址是一台计算机在网络中的区别于其它计算机的唯一标识。而端口则像一扇门,计算机中的程序通过这扇门与其它程序相互通信。通俗点讲,我们如果想同网络上的另一台计算机通信,首先需要知道IP地址。拥有这个IP地址的那台计算机有很多门,所以我们还需要知道要打开哪扇门,这就要求我们还必须要一个端口号。有了IP地址和端口号,就可以发送和接收数据了。
C#中的IP地址
C#中与IP地址相关的类都放在System.Net命名空间下。主要使用两个类来处理各种类型的IP地址信息:
l IPAddress
l IPEndPoint
IPAddress
一个IPAddress对象表示一个IP地址信息。IPAdress默认的构造函数是:
public IPAddress(long address)
参数address是一个长整型的值。构造函数内部会将这个长整型值转换成IPAddress值。通常很少使用默认构造函数,而是使用IPAddress类的某些方法来创建或设置IP地址。通常Parse()方法来创建一个IPAdress实例:
IPAddress newaddress = IPAddress.Parse("192.168.1.1");
IPEndPoint
.NET FrameWork使用IPEndPoint对象来表示某一个IP地址/端口组合。在将Socket与本地Ip地址绑定的时候需要用到IPEndPoint对象,此外,与远程进行Socket进行连接的时候也要用到IPEndPoint对象。
面向连接和面向非连接
在进行网络通信时,有两种通信类型:一种是面向连接的,一种是面向非连接的。简单来说,面向连接的通信就好比打电话,需要通话双方接通线路才可以通信。面向非连的,好比寄信,发信方与收信方不需要建立专门的连接,发信方只要写好收信地址,将信件投出去就行了。面向连接的通信使用的是TCP协议,面向非连接的通信使用的是UDP协议。
我们暂时只讨论面向连接的通信实现方法。
面向连接的Socket实现方法
进行面向连接的通信,至少需要一对套接字(Socket),一个运行于客户机端,称之为Client Socket,另一个运行于服务器端,称之为Server Socket。
当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户端,接受呼叫连接请求的一方成为服务端。
在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是IP地址和PORT(端口号)。也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一地确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。
下图描述了服务器端和客户端建立连接的过程:
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字,并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
服务器端
要想和客户端通信,服务器端必须做四件事情:
创建Socket对象
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ip, 8885);
Socket newsock = Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(localEndPoint);
newsock.Listen(10);
Socket client = newsock.Accept();
Accept()方法创建的Socket对象client现在就可以和客户端之间传输数据了。
客户端
通过上述步骤创建了服务端之后,你就可以创建一个简单的客户端与服务端通信了。创建客户端仅仅需要两步:
示例代码:
IPEndPoint ipep =
new IPEndPoint(Ipaddress.Parse("127.0.0.1"), 8000);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
server.Connect(ipep);
上述示例是尝试连接到地址为127.0.0.1的服务端。127.0.0.1这个IP地址表示的是当前主机(当前运行此程序的计算机)。在只有一台计算机时,没有网络环境时,我们可以用127.0.0.1来测试网络应用程序。
如果你只知道对方的主机名,而不知道主机Ip时,可以使用Dns.Resolve()方法来获取对方的Ip(Dns位于System.Net命名空间)。
一旦远程主机接受了连接请求,客户端就可以使用Send()和Receive()方法来传输数据了。
【参考资料】
标签:
原文地址:http://www.cnblogs.com/czg1046726286/p/4906421.html