博文

运用异步输入输出流编写socket进程通信(2007-02-08 09:21:00)

摘要:代码号为”merlin”的j2se1.4带来了一些激动人心的新特性,诸如对正则表达式的支持,异步输入输出流,通道(channel),字符集等.虽然该版本还处在测试阶段,但这些新特性早已让开发人员们跃跃欲试.在merlin发布之前,异步输入输出流的应用还只是c,c++程序员的特殊武器;在merlin中引入异步输入输出机制之后,java程序员也可以利用它完成很多简洁却是高质量的代码了.本文将介绍怎样使用异步输入输出流来编写socket进程通信程序.同步?异步输入输出机制的引入 在merlin之前,编写socket程序是比较繁琐的工作.因为输入输出都必须同步.这样,对于多客户端客户/服务器模式,不得不使用多线程.即为每个连接的客户都分配一个线程来处理输入输出.由此而带来的问题是可想而知的.程序员不得不为了避免死锁,线程安全等问题,进行大量的编码和测试.很多人都在抱怨为什么不在java中引入异步输入输出机制.比较官方的解释是,任何一种应用程序接口的引入,都必须兼容任何操作平台.因为java是跨平台的.而当时支持异步输入输出机制的操作平台显然不可能是全部.自java 2 platform以后,分离出j2se,j2me,j2ee三种不同类型的应用程序接口,以适应不同的应用开发.java标准的制订者们意识到了这个问题,并且支持异步输入输出机制的操作平台在当今操作平台中处于主流地位.于是,jdk(j2se) 的第五次发布中引入了异步输入输出机制.以前的socket进程通信程序设计中,一般客户端和服务器端程序设计如下: 服务器端: //服务器端监听线程while (true) <.............socket clientsocket;clientsocket = socket.accept(); //取得客户请求socket,如果没有//客户请求连接,线程在此处阻塞//用取得的socket构造输入输出流printstream os = new printstream(new bufferedoutputstream(clientsocket.getoutputstream(),1024), false);bufferedreader is = new bufferedreader(new inputstreamreader(clientsocket.getinputs......

阅读全文(5118) | 评论:0

Visual C# 2005中编写Socket网络程序(2007-02-08 09:19:00)

摘要:在网络环境下,我们最感兴趣的两个命名空间是System.Net和System.Net.Sockets。System.Net命名空间通常与较高程的操作有关,例如download或upload,试用HTTP和其他协议进行Web请求等等,而System.Net.Sockets命名空间所包含的类通常与较低程的操作有关。如果要直接使用Sockets或者TCP/IP之类的协议,这个命名空间的类是非常有用的。

  在.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 网络应用程序原来有规可寻,......

阅读全文(5254) | 评论:2

异步客户端套接字示例(2007-02-08 09:18:00)

摘要:下面的示例程序创建一个连接到服务器的客户端。该客户端是用异步套接字生成的,因此在等待服务器返回响应时不挂起客户端应用程序的执行。该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串。using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // State object for receiving data from remote device. public class StateObject { // Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 256; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder(); } public class AsynchronousClient { // The port number for the remote device. private const int port = 11000; // ManualResetEvent instances signal completion. private static ManualResetEvent connectDone = new ManualResetEvent(false); private static ManualResetEvent sendDone = new ManualResetEvent(false); private static ManualResetEvent receiveDone = new......

阅读全文(2324) | 评论:0

C#.net同步异步SOCKET通讯和多线程总结(2007-02-08 09:14:00)

摘要:同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip和监听的端口与socket进行绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信。 客户端建立一个socket,设置好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器进行通信。 服务器端和客户端的连接及它们之间的数据传送均采用同步方式。   Socket Socket是tcp\ip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点。在网络通信中需要两个主机或两个进程。通过网络传递数据,程序在网络对话的每一端需要一个socket。        Tcp/IP传输层使用协议端口将数据传送给一个主机的特定应用程序,协议端口是一个应用程序的进程地址。传输层模块的网络软件模块要于另一个程序通信,它将使用协议端口,socket是运行在传输层的api,使用socket建立连接发送数据要指定一个端口给它。 Socket: Stream Socket流套接字 Socket提供双向、有序、无重复的数据流服务,出溜大量的网络数据。 Dgram socket数据包套接字 支持双向数据流,不保证传输的可靠性、有序、无重复。 Row socket 原始套接字 访问底层协议 建立socket 用C# 命名空间:using System.Net;using System.Net.Socket; 构造新的socket对象:socket原型: Public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType) AddressFamily 用来指定socket解析地址的寻址方案。InterNetwork标示需要ip版本4的地址,InterNetworkV6需要ip版本6的地址 SocketType参数指定socket类型Raw支持基础传输协议访问,Stream支持可靠,双向,基于连接的数据流。 Proto......

阅读全文(11938) | 评论:3

socket 阻塞与非阻塞 同步与异步(2007-02-08 09:12:00)

摘要:阻塞与非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。缺省情况下, 三述符处于阻塞状态。   同步异步与阻塞和非阻塞是两种不同的概念来着
同步异步指的是通信模式,而阻塞和非阻塞指的是在接收和发送时是否等待动作完成才返回
所以不能混淆这四个磁。
以下是我的一些理解,请大家多指教
首先是通信的同步,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。所以这个时候的所有请求将会在服务端得到同步
其次是通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就象是一个请求队列,所有的动作在这里不会得到同步的。 阻塞和非阻塞只是应用在请求的读取和发送。 在实现过程中,如果服务端是异步的话,客户端也是异步的话,通信效率会很高,但如果服务端在请求的返回时也是返回给请求的链路时,客户端是可以同步的,这种情况下,服务端是兼容同步和异步的。相反,如果客户端是异步而服务端是同步的也不会有问题,只是处理效率低了些。   同步=阻塞式,异步=非阻塞式 同步和异步都只针对于本机SOCKET而言的 同步模式下,比如RECIEV和SEND,都要确保收到或发送完才返回,继续执行下面的代码 不然就阻塞在哪里,所以,同步模式下,一般要用到线程来处理。 异步模式就不同了,不管有没有收到或发送出去,他都马上返回,继续执行下面的代码,结果又消息通知。......

阅读全文(10240) | 评论:0

ASP.NET 网页介绍(2007-01-31 11:35:00)

摘要:使用 ASP.NET 网页可以为网站创建动态内容。通过使用静态 HTML 页(.htm 或 .html 文件),服务器读取文件并将该文件按原样发送到浏览器,以此来满足 Web 请求。相比之下,当用户请求 ASP.NET 网页(.aspx 文件)时,该页则作为程序在 Web 服务器上运行。该页运行时,可以执行您的网站要求的任何任务,包括计算值、读写数据库信息或者调用其他程序。该页动态地生成标记(HTML 或另一种标记语言中的元素),并将该标记作为动态输出发送到浏览器。 本主题概述了 ASP.NET 网页在 Web 应用程序中的工作方式的基本特征。 回发和往返行程 ASP.NET 页面作为代码在服务器上运行。因此,要得到处理,页面必须配置为当用户单击按钮(或者当用户选中复选框或与页面中的其他控件交互)时提交到服务器。每次页面都会提交回自身,以便它可以再次运行其服务器代码,然后向用户呈现其自身的新版本。 ASP.NET 网页的处理循环如下: 用户请求页面。(使用 HTTP GET 方法请求页面。)页面第一次运行,执行初步处理(如果您已通过编程让它执行初步处理)。 页面将标记动态呈现到浏览器,用户看到的网页类似于其他任何网页。 用户键入信息或从可用选项中进行选择,然后单击按钮。(如果用户单击链接而不是按钮,页面可能仅仅定位到另一页,而第一页不会被进一步处理。) 页面发送到 Web 服务器。(浏览器执行 HTTP POST 方法,该方法在 ASP.NET 中称为“回发”。)更明确地说,页面发送回其自身。例如,如果用户正在使用 Default.aspx 页面,则单击该页上的某个按钮可以将该页发送回服务器,发送的目标则是 Default.aspx。 在 Web 服务器上,该页再次运行。并且可在页上使用用户键入或选择的信息。 页面执行您通过编程所要实行的操作。 页面将其自身呈现回浏览器。 只要用户在该页面中工作,此循环就会继续。用户每次单击按钮时,页面中的信息会发送到 Web 服务器,然后该页面再次运行。每个循环称为一次“往返行程”。由于页面处理发生在 Web 服务器上,因此页面可以执行的每个操作都需要一次到服务器的往返行程。 注意 ASP.NET 网页可以运行客户端脚本。客户端脚本不需要到服......

阅读全文(2310) | 评论:0

ASP.NET 网页语法概述(2007-01-31 11:32:00)

摘要:ASP.NET 网页的创建方式与静态 HTML 网页(不包含基于服务器处理的页面)的创建方式相似,但前者包含在页面运行时由 ASP.NET 识别和处理的其他元素。区别 ASP.NET 网页与静态 HTML(或其他)页的特征如下: 文件扩展名为 .aspx,而不是 .htm、.html 或其他文件扩展名。.aspx 文件扩展名可使 ASP.NET 对页面进行处理。 注意 在 Internet 信息服务 (IIS) 中将文件扩展名映射到 ASP.NET。默认情况下,.aspx 页由 ASP.NET 运行,而 .htm 和 .html 页不是。 可选的 @ Page 指令或其他指令,适合于正在创建的页面类型。 为 ASP.NET 正确配置的 form 元素。只有页面所含控件的值在页面处理期间要使用时,才需要 form 元素。 Web 服务器控件。 如果您向页面添加自己的代码,则为服务器代码。 注意 如果希望页面符合 XHTML 标准,则必须包含其他元素,如 DOCTYPE 元素。有关详细信息,请参见 ASP.NET 和 XHTML。 以下各节提供有关这些元素的更多详细信息。 可以使用 .aspx 文件扩展名对任何 HTML 页进行重命名,然后该页将作为 ASP.NET 网页运行。但是,如果页面不涉及服务器处理,则不需要向其添加 .aspx 文件扩展名,因为这会增加页面处理的系统开销。 ASP.NET 网页示例 下面的代码示例演示一个页面,它包含组成 ASP.NET 网页的基本元素。该页面包含 HTML 页中可能含有的静态文本,以及特定于 ASP.NET. 的元素。特定于 ASP.NET 的元素将突出显示。 注意 为清楚起见,此示例页不配置为符合 XHTML。有关详细信息,请参见 ASP.NET 和 XHTML。 Visual Basic  复制代码 <%@ Page Language="VB" %> <html> <script runat="server"> Sub Button1_Click(ByVal sender As Object,......

阅读全文(2550) | 评论:0

服务器端注释(2007-01-31 11:25:00)

摘要:服务器端注释允许开发人员在 ASP.NET 应用程序文件的任何部分(除了 <script> 代码块内部)嵌入代码注释。服务器端注释元素的开始标记和结束标记之间的任何内容,不管是 ASP.NET 代码还是文本,都不会在服务器上进行处理或呈现在结果页上。 <%-- Content of comments, or commented out server controls --%> 备注 ASP.NET 服务器端注释块与传统的语言特定注释块具有相同的用法(包括文档和测试)。例如,您可以使用服务器端注释来描述文件的标记部分,或注释掉页面中声明的一个或多个服务器控件。这些注释可用于大多数类型的 ASP.NET 应用程序文件,包括网页、用户控件、Global.asax 文件、母版页和外观文件 请注意,服务器端注释用于页面的主体,但不在服务器端代码块中使用。当您在代码声明块(包含在 <script runat="server"></script> 标记中的代码)或代码呈现块(包含在 <% %> 标记中的代码)中使用特定语言时,应使用正用于编码的语言的注释语法。 如果在 <% %> 块中使用服务器端注释块,则会出现编译错误。 开始和结束注释标记可以出现在同一行代码中,也可以由许多被注释掉的行隔开。 服务器端注释块不能被嵌套。 示例 下面的代码示例演示使用服务器端注释注释掉的 Button 控件。   复制代码 <%-- <asp:button runat="server" id="MyButton" OnClick="MyButton_Click" /> --%> ......

阅读全文(2173) | 评论:0

从 ASP.NET 显示(2007-01-31 11:23:00)

摘要:可以使用多种方法从 ASP.NET 程序显示信息。一种方法是使用 <%= %> 结构。另一种方法是使用 Response.Write 语句。 使用 <%= %> 从 ASP.NET 程序显示信息的最简单方法是使用 <%= %> 结构。在等号后面输入的值将写入当前页。下面的代码显示 name 变量的值。   复制代码 Hello <%= name %>! 如果名称的值是“Frank”,此代码将在当前页中写入以下字符串:   复制代码 Hello Frank! <%= %> 结构在显示单条信息时最为有用。 Response.Write 语句 显示文本的另一种方法是使用 Response.Write 语句。可以将它放在 <% %> 块内。 <% Response.Write("Hello, World!") %> Response.Write 语句还可以在脚本块内的函数或方法中使用。下面的示例显示了一个包含 Response.Write 语句的函数。 注意 在 ASP.NET 页中,函数和变量应当在 <script> 块内定义,而可执行代码必须括在 <% %> 块内。   复制代码 <script runat="server" language="JScript"> function output(str) { Response.Write(str); } var today = new Date(); </script> Today's date is <% output(today); %>. <BR> Response.Write 语句的输出被合并到正在处理的页中。这样就允许 Response.Write 的输出编写代码,而该代码又可显示文本。例如,下面的代码编写一个脚本块,该脚本块在正在访问该页的浏览器的警报窗口中显示当前日期(服务器上的)。<script> 标记被拆分开,因此服务器将不处理此标......

阅读全文(2142) | 评论:0

指令语法 (2007-01-31 11:16:00)

摘要:指定当页和用户控件编译器处理 ASP.NET Web 窗体页 (.aspx) 和用户控件 (.ascx) 文件时所使用的设置。 备注 当使用指令时,虽然标准的做法是将指令包括在文件的开头,但是它们可以位于 .aspx 或 .ascx 文件中的任何位置。每个指令都可以包含一个或多个特定于该指令的属性(与值成对出现)。 注意 @ Page 指令只能在 .aspx 文件中使用,而 @ Control 指令只能在 .ascx 文件中使用。 ASP.NET 页框架支持以下指令。 @ Page 定义 ASP.NET 页分析器和编译器使用的特定于页的属性。只能包含在 .aspx 文件中。 @ Control 定义 ASP.NET 页分析器和编译器使用的控件特定属性。只能包含在 .ascx 文件(用户控件)中。 @ Import 将命名空间显式导入页或用户控件中。 @ Implements 以声明的方式指示页或用户控件实现指定的 .NET Framework 接口。 @ Register 将别名与命名空间及类名关联起来,从而允许用户控件和自定义服务器控件在被包括到请求的页或用户控件时呈现。 @ Assembly 在编译过程中将程序集链接到当前页,以使程序集的所有类和接口都可用在该页上。 @ Master 标识 ASP.NET 母版页。 @ PreviousPageType 提供用于获得上一页的强类型的方法,可通过 PreviousPage 属性访问上一页。 @ MasterType 为 ASP.NET 页的 Master 属性分配类名,使得该页可以获取对母版页成员的强类型引用。 @ OutputCache 以声明的方式控制页或用户控件的输出缓存策略。 @ Reference 以声明的方式将页或用户控件链接到当前页或用户控件。......

阅读全文(2016) | 评论:0