Visual C#.Net 网络程序开发-Socket篇第1/2页

Visual C#.Net 网络程序开发-Socket篇  
作者: 宋华

作者: www.ASPCool.com

Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。

抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而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 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。

IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); 
IPAddress ipAddress = ipHostInfo.AddressList[0];

你也可以使用GetHostName方法得到IPHostEntry实例:

IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")

在使用以上方法时,你将可能需要处理以下几种异常:

SocketException异常:访问Socket时操作系统发生错误引发

ArgumentNullException异常:参数为空引用引发

ObjectDisposedException异常:Socket已经关闭引发

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

IPEndPoint ipe = new IPEndPoint(ipAddress,11000);

当前1/2页 12下一页阅读全文

时间: 2007-03-07

详解C# Socket异步通信实例

TCPServer 1.使用的通讯通道:socket 2.用到的基本功能: ①Bind, ②Listen, ③BeginAccept ④EndAccept ⑤BeginReceive ⑥EndReceive 3.函数参数说明 Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 新建socket所使用的参数均为系统预定义的量,直接选取使用. listener.B

详解C# Socket简单例子(服务器与客户端通信)

这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信. 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序.在这个例子中,实际上还有很多问题没有解决,如消息边界问题.端口号是否被占用.消息命令的解析问题等.. 下面是两个程序的代码,(两个程序均为控制台程序) 先发服务端的(Server)完整代码如下: 引入命名空间: using System.Net.Sockets; using SystemNet; using SystemThreading; 完

C#实现的Socket服务器端、客户端代码分享

服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; namespace Server { class Program { static void Main(string[] args) { Socket server = new Socket(AddressFamily.InterNetwork, SocketType

C#中异步Socket通信编程代码实例

本文将在C#中Socket同步通信的基础上,分析和研究Socket异步编程的实现方法,目的是深入了解Socket编程的基本原理,增强对网络游戏开发相关内容的认识. 什么是Socket编程的异步是实现 所谓Socket编程的异步实现是指按照异步过程来实现Socket编程,那么什么是异步过程呢,我们把在完成了一次调用后通过状态.通知和回调来告知调用者的方式成为异步过程,换句话说,在异步过程中当调用一个方法时,调用者并不能够立刻得到结果,只有当这个方法调用完毕后调用者才能获得调用结果.这样做的好处是什

C#中Socket通信用法实例详解

本文实例讲述了C#中Socket通信用法.分享给大家供大家参考.具体如下: 一.UDP方式: 服务器端代码: static void Main(string[] args) { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点 Socket newsock = new Socket(AddressFamily.InterNetwork, S

C#创建一个小型Web Server(Socket实现)

要实现了Web Server,通过以下几句代码浏览器访问就可以获得访问的数据. Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81)); socketWatch.Listen(20); // 参数表示最多可容纳的等待

使用C#开发Socket通讯的方法

下面的示例显示如何使用 Socket 类向 HTTP 服务器发送数据和接收响应. [C#]  public string DoSocketGet(string server)  {  //Sets up variables and a string to write to the server  Encoding ASCII = Encoding.ASCII;  string Get = "GET / HTTP/1.1\r\nHost: " + server +  "\r\n

C#使用Socket实现发送和接收图片的方法

本文实例讲述了C#使用Socket实现发送和接收图片的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.IO; namespace ConsoleApplication1 { Class Program { static void Main (String[]

C#实现Socket通信的解决方法

本文以实例详述了C#实现Socket通信的解决方法,具体实现步骤如下: 1.首先打开VS新建两个控制台应用程序: ConsoleApplication_socketServer和ConsoleApplication_socketClient.   2.在ConsoleApplication_socketClient中输入以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Tex

c# socket编程udp客户端实现代码分享

复制代码 代码如下: Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());//设置服务端终结点IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);//创建与服务端连接的套接字,指定网络类型,数据连接类型和网络协议Socket ConnSocket = new Socket(Address

Java编程实现月食简单代码分享

用java的框架和面板的知识做的一个展示月食过程的小程序.这里的想法就是先把背景设置成黑色,然后画一个黄色的圆作为月亮,接着画一个黑色的圆,将它的y坐标与月亮相同,让这个x不断的自增,(这个x代表的是fillArc()里面的那个其实位置坐标)然后很关键的两个方法是sleep()和repaint()这两个,它们可以近似于让屏幕的内容不断的刷新,当与月亮重合时,黑色就会覆盖掉黄色,这样就让人觉得是月亮在变化. 有兴趣的朋友可以添加更多元素在里面. import javax.swing.JFrame;

Java编程枚举类实战代码分享

本文句句走心,希望老铁们用心阅读并实战,一定会有收获的. 摘要:本文主要讨论生产环境中枚举类的使用.首先会通过对枚举类概念进行简单的介绍,引入我们讨论的主题:然后就直接进入实战部分,本文只会介绍在实战中用的比较多,也比较常用的情况,所以希望老铁可以用心体会并实践,最终化为己有:最后会大致在对枚举的 API 做了一个简单的介绍.其余没有介绍的内容,基本上在我们的生产环境中极少用到,如果有兴趣的可以自己在深入研究. 枚举 概念:枚举类型是 Java 5 中新增特性的一部分,它是一种特殊的数据类型,它

.net socket客户端实例代码分享

客户端代码 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Net; using System.Threading; using System.Net.Sockets; namespace W.Common { public class CacheSocket { public Socke

Java中Socket设置连接超时的代码分享

前言 大家都知道Java的Socket如果连接不到指定IP和Port的主机,就会抛出IOException异常,而通常情况下,从连接到出现IOException会有一段不定的时长,就是所谓的超时时长,如果超时时长过长,在开发时会影响测试,如果代码成了产品,又会非常的影响用户体验,那么要怎么设置这个时长呢?下面来一起看看详细的介绍: Socket的类提供了一个方法: public void connect(SocketAddress endpoint, int timeout) throws IO

php socket实现的聊天室代码分享

/** * patServer * PHP socket server base class * Events that can be handled: * * onStart * * onConnect * * onConnectionRefused * * onClose * * onShutdown * * onReceiveData * * @version 1.1 * @author Stephan Schmidt <schst@php-tools.de> * @package pa

使用node.js 获取客户端信息代码分享

在网上看见很多问node.js如何获取客户端信息,所以记录下来,以供大家参考. 结果: 是不是很简单呢,有相同需求的小伙伴直接拿走,自由使用吧.

Java反射机制实例代码分享

本文旨在对Java反射机制有一个全面的介绍,希望通过本文,大家会对Java反射的相关内容有一个全面的了解. 阅读本文之前,大家可先行参阅<重新理解Java泛型>. 前言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题.本文我们就从实际应用的角度出发,来应用一下Java的反射机制. 反射

Java Socket编程服务器响应客户端实例代码

通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; impo

Android编程实现TCP、UDP客户端通信功能示例

本文实例讲述了Android编程实现TCP.UDP客户端通信功能.分享给大家供大家参考,具体如下: 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例: 代码一 TCP通讯: private void tcpdata() { try { Socket s = new Socket("192.168.0.25", 65500); // outgoing stream redirect to socket Out