c#socket编程新手入门篇.doc
《c#socket编程新手入门篇.doc》由会员分享,可在线阅读,更多相关《c#socket编程新手入门篇.doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Socket编程-新手入门篇(附有实例)本文描述了Windows平台下使用C#进行Socket开发的方法和实例,并扼要的描述了UNIX平台下的Berkeley Socket和AT&T的TLI编程接口的说明。一、基于.net平台的C# Socket编程前一篇Visual C#.Net网络程序开发之Socket中说到:支持Http、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP 套接字的创建,不需要处理连接的细节, 这使得我们在编写套接字级别的协议时,可以更多
2、地尝试使用 TCPClient 、 UDPClient和TcpListener,而不是直接向 Socket 中写。它们之间的这种层次关系示意如下: 可见,TcpClient 类基于 Socket 类构建,这是它能够以更高的抽象程度提供 TCP 服务的基础。正因为这样,许多应用层上的通讯协议,比如FTP(File Transfers Protocol)文件传输协议、HTTP(Hypertext Transfers Protocol)超文本传输协议等都直接创建在TcpClient等类之上。 TCPClient 类使用 TCP 从 Internet 资源请求数据。TCP 协议建立与远程终结点的连接,
3、然后使用此连接发送和接收数据包。TCP 负责确保将数据包发送到终结点并在数据包到达时以正确的顺序对其进行组合。 从名字上就可以看出,TcpClient类专为客户端设计,它为 TCP 网络服务提供客户端连接。TcpClient 提供了通过网络连接、发送和接收数据的简单方法。 若要建立 TCP 连接,必须知道承载所需服务的网络设备的地址(IPAddress)以及该服务用于通讯的 TCP 端口 (Port)。Internet 分配号码机构 (Internet Assigned Numbers Authority, IANA) 定义公共服务的端口号(你可以访问 http:/www.iana.org/a
4、ssignments/port-numbers获得这方面更详细的资料)。IANA 列表中所没有的服务可使用 1,024 到 65,535 这一范围中的端口号。要创建这种连接,你可以选用TcpClient类的三种构造函数之一: 1、public TcpClient()当使用这种不带任何参数的构造函数时,将使用本机默认的ip地址并将使用默认的通信端口号0。这样情况下,如果本机不止一个ip地址,将无法选择使用。以下语句示例了如何使用默认构造函数来创建新的 TcpClient: TcpClient tcpClientC = new TcpClient(); 2、public TcpClient(IPE
5、ndPoint)使用本机IPEndPoint创建TcpClient的实例对象。上一篇介绍过了,IPEndPoint将网络端点表示为IP地址和端口号,在这里它用于指定在建立远程主机连接时所使用的本地网络接口(IP 地址)和端口号,这个构造方法为使用本机IPAddress和Port提供了选择余地。下面的语句示例了如何使用本地终结点创建 TcpClient 类的实例: IPHostEntry ipInfo=Dns.GetHostByName();/主机信息 IPAddressList ipList=ipInfo.AddressList;/IP地址数组 IPAddress ip=ipList0;/多I
6、P地址时一般用第一个 IPEndPoint ipEP=new IPEndPoint(ip,4088);/得到网络终结点 try TcpClient tcpClientA = new TcpClient(ipLocalEndPoint); catch (Exception e ) Console.WriteLine(e.ToString(); 到这里,你可能会感到困惑,客户端要和服务端创建连接,所指定的IP地址及通信端口号应该是远程服务器的呀!事实上的确如此,使用以上两种构造函数,你所实现的只是TcpClient实例对象与IP地址和Port端口的绑定,要完成连接,你还需要显式指定与远程主机的连接
7、,这可以通过TcpClient类的Connect方法来实现, Connet方法使用指定的主机名和端口号将客户端连接到 远程主机: 1)、public void Connect(IPEndPoint); 使用指定的远程网络终结点将客户端连接到远程 TCP 主机。 public void Connect(IPAddress, int); 使用指定的 IP 地址和端口号将客户端连接到 TCP 主机。 public void Connect(string, int); 将客户端连接到指定主机上的指定端口。 需要指出的是,Connect方法的所有重载形式中的参数IPEndPoint网络终结点、IPAdd
8、ress以及表现为string的Dns主机名和int指出的Port端口均指的是远程服务器。 以下示例语句使用主机默认IP和Port端口号0与远程主机建立连接: TcpClient tcpClient = new TcpClient();/创建TcpClient对象实例 try tcpClient.Connect(,11002);/建立连接 catch (Exception e ) Console.WriteLine(e.ToString(); C#是微软随着VS.net新推出的一门语言。它作为一门新兴的语言,有着C+的强健,又有着VB等的RAD特性。而且,微软推出C#主要的目的是为了对抗Sun
9、公司的Java。大家都知道Java语言的强大功能,尤其在网络编程方面。于是,C#在网络编程方面也自然不甘落后于人。本文就向大家介绍一下C#下实现套接字(Sockets)编程的一些基本知识,以期能使大家对此有个大致了解。首先,我向大家介绍一下套接字的概念。 套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要
10、执行某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。 套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套接字有两种不同的类型:流套接字和数据报套接字。 套接字工作原理: 要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
11、所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。C#中的套接字编程
12、实例: 通过向大家简单的介绍套接字的基本概念和实现套接字编程的基本原理,我想大家对套接字编程已有了初步的了解。不过,上面介绍的仅仅是基本概念和原理,要真正运用还是需要一定的工作的。对基本概念和原理的真正理解的最好方法莫过于自己动手做一个实例,下面我就向大家介绍一个很好的用C#实现套接字编程的实例聊天室程序。 本程序是基于C/S(服务器/客户端)构架的,程序包含一个服务器端的应用程序和一个客户端的应用程序。首先,在服务器上运行服务器端的应用程序,该程序一运行就开始服务器监听。然后,在客户机上就可以打开客户端的应用程序。程序打开后可以与服务器端应用程序进行连接,即进行客户端请求。在连接确认后,客户
13、端用户可以和其他的客户端用户进行聊天。客户端人数没有限制,同时还支持“悄悄话”聊天模式,支持聊天记录。所以这是一个学习套接字编程的相当不错的例子。而且,程序中为了处理每个客户端的信息还用到了多线程机制。在每个客户端与服务器端连接成功后,它们之间就建立一个线程。这样运用了多线程之后,客户端之间就不会相互影响,即使其中一个出了错误也不会影响到另一个。 下面,我就向大家具体介绍该实例: 服务器端程序: 1 打开VS.net,新建一个C#的模板为“Windows 应用程序”的项目,不妨命名为“ChatServer”。 2 布置界面。只需在界面上添加一个ListBox控件即可,该控件主要用于显示客户端的
14、用户的一些信息的。图象如下: 3 服务器端程序的代码编写。 对于服务器端,主要的作用是监听客户端的连接请求并确认其请求。程序一开始便打开一个StartListening()线程。 private void StartListening() listener = new TcpListener(listenport); listener.Start(); while (true) try Socket s = listener.AcceptSocket(); clientsocket = s; clientservice = new Thread(new ThreadStart(ServiceC
15、lient); clientservice.Start(); catch(Exception e) Console.WriteLine(e.ToString() ); 该线程是一直处于运行状态的。当服务器端接收到一个来自客户端的连接请求后,它就打开一个ServiceClient()线程来服务客户端。当一个连接被建立后,每个客户端就被赋予一个属于它自己的套接字。同时,一个Client类的对象被建立。该对象包含了客户端的一些相关信息,该信息被保存在一个数组列表中。 Client类如下: using System; using System.Threading; namespace ChatServ
16、er using System.Net.Sockets; using System.Net; / / Client 的摘要说明。 / public class Client private Thread clthread; private EndPoint endpoint; private string name; private Socket sock; public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock) / TODO: 在此处添加构造函数逻辑 clthread = _thread; e
17、ndpoint = _endpoint; name = _name; sock = _sock; public override string ToString() return endpoint.ToString()+ : + name; public Thread CLThread getreturn clthread; setclthread = value; public EndPoint Host getreturn endpoint; setendpoint = value; public string Name getreturn name; setname = value; p
18、ublic Socket Sock getreturn sock; setsock = value; 程序的主体部分应是ServiceClient()函数。该函数是一个独立的线程,其主要部分是一个while循环。在循环体内,程序处理各种客户端命令。服务器端接收来自客户端的以ASCII码给出的字符串,其中包含了一个“|”形式的分隔符。字符串中“|”以前的部分就是具体的命令,包括CONN、CHAT、PRIV、GONE四种类型。CONN命令建立一个新的客户端连接,将现有的用户列表发送给新用户并告知其他用户有一个新用户加入。CHAT命令将新的信息发送给所有用户。PRIV命令将悄悄话发送给某个用户。GO
19、NE命令从用户列表中除去一个已离开的用户并告知其他的用户某某已经离开了。同时,GONE命令可以设置布尔型的变量keepalive为false从而结束与客户端连接的线程。ServiceClient()函数如下: private void ServiceClient() Socket client = clientsocket; bool keepalive = true; while (keepalive) Byte buffer = new Byte1024; client.Receive(buffer); string clientcommand = System.Text.Encoding
20、.ASCII.GetString(buffer); string tokens = clientcommand.Split(new Char|); Console.WriteLine(clientcommand); if (tokens0 = CONN) for(int n=0; n Client cl = (Client)clientsn; SendToClient(cl, JOIN| + tokens1); EndPoint ep = client.RemoteEndPoint; Client c = new Client(tokens1, ep, clientservice, clien
21、t); clients.Add(c); string message = LIST| + GetChatterList() +rn; SendToClient(c, message); lbClients.Items.Add(c); if (tokens0 = CHAT) for(int n=0; n Client cl = (Client)clientsn; SendToClient(cl, clientcommand); if (tokens0 = PRIV) string destclient = tokens3; for(int n=0; n Client cl = (Client)c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- socket 编程 新手入门
限制150内