加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在C#中创建Socket对象

(2010-07-04 10:06:56)
标签:

电脑

socket

c

tcp/ip

通道

it

分类: star

在C#中创建Socket对象



    今天我们在C#中创建Socket对象,了解Socket对象创建时的关键代码,我将带大家写个控制台的服务器、客户机。

    在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。 

    其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。 

    所以,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据; 

    针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。 

    在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:

 

     public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); 

其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。 

    下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有: 

Socket.Connect方法:建立到远程设备的连接 
public void Connect(EndPoint remoteEP)(有重载方法
 
Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。 
public int Send(byte[], int, SocketFlags);(有重载方法) 

Socket.SendTo 方法 将数据发送到特定终结点。 
public int SendTo(byte[], EndPoint);(有重载方法) 

Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。 
public int Receive(byte[],int,SocketFlags); 

Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。 
public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint); 

Socket.Bind 方法:使 Socket 与一个本地终结点相关联: 
public void Bind( EndPoint localEP ); 

Socket.Listen方法:将 Socket 置于侦听状态。 
public void Listen( int backlog ); 

Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。 
public Socket Accept(); 

Socket.Shutdown方法:禁用某 Socket 上的发送和接收 
public void Shutdown( SocketShutdown how ); 

Socket.Close方法:强制 Socket 连接关闭 
public void Close();
 


      可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。 

    用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例: 

    IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:

     IPAddress myIP = IPAddress.Parse("192.168.1.2"); 

Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。下面的代码获取一个 IPAddress 实例,该实例包含服务器 accp 的 IP 地址。

     IPAddress ipAddress = Dns.GetHostAddresses("accp")[0]; 

在掌握上面得知识后,下面的代码将该服务器主机( accp 的 IP 地址与端口号组合,以便为连接创建远程终结点:

      IPEndPoint ipe = new IPEndPoint(ipAddress,11000); 

确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。

      最后需要知道的是:Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。

 

 

 



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有