活着的死人 发表于 2015-1-16 22:43:10

ASP.NET编程:C# 2.0 套接字编程实例初探

可怜的程序员,还是逃不出移植的命运!编程  起首从道理上注释一下接纳Socket接口的收集通信,这里以最经常使用的C/S形式作为典范,起首,服务端有一个历程(或多个历程)在指定的端口守候客户来毗连,服务程序守候客户的毗连信息,一旦毗连上以后,就能够按计划的数据互换办法和格局举行数据传输。客户端在必要的时候收回向服务真个毗连哀求。这里为了便于了解,提到了一些挪用及其大抵的功效。利用socket挪用后,仅发生了一个可使用的socket形貌符,这时候还不克不及举行通讯,还要利用其他的挪用,以使得socket所指的布局中利用的信息被填写完。

  在利用TCP协定时,一样平常服务端历程先利用socket挪用失掉一个形貌符,然后利用bind挪用将一个名字与socket形貌符毗连起来,关于Internet域就是将Internet地点联编到socket。以后,服务端利用listen挪用指出守候服务哀求行列的长度。然后就能够利用accept挪用守候客户端倡议毗连,通常为堵塞守候毗连,一旦有客户端收回毗连,accept前往客户的地点信息,并前往一个新的socket形貌符,该形貌符与本来的socket有不异的特征,这时候服务端就能够利用这个新的socket举行读写操纵了。一样平常服务端大概在accept前往后创立一个新的历程举行与客户的通讯,父历程则再到accept挪用处守候另外一个毗连。客户端历程一样平常先利用socket挪用失掉一个socket形貌符,然后利用connect向指定的服务器上的指定端口倡议毗连,一旦毗连乐成前往,就申明已创建了与服务器的毗连,这时候就能够经由过程socket形貌符举行读写操纵了。

  .NetFrameWork为Socket通信供应了System.Net.Socket定名空间,在这个定名空间内里有以下几个经常使用的主要类分离是:

  ・Socket类这个低层的类用于办理毗连,WebRequest,TcpClient和UdpClient在外部利用这个类。

  ・NetworkStream类这个类是从Stream派生出来的,它暗示来自收集的数据流

  ・TcpClient类同意创立和利用TCP毗连

  ・TcpListener类同意监听传进的TCP毗连哀求

  ・UdpClient类用于UDP客户创立毗连(UDP是别的一种TCP协定,但没有失掉普遍的利用,次要用于当地收集)

  上面我们来看一个基于Socket的双机通讯代码的C#版本

  起首创立Socket工具的实例,这能够经由过程Socket类的机关办法来完成:

publicSocket(AddressFamilyaddressFamily,SocketTypesocketType,ProtocolTypeprotocolType);
  个中,addressFamily参数指定Socket利用的寻址计划,socketType参数指定Socket的范例,protocolType参数指定Socket利用的协定。

  上面的示例语句创立一个Socket,它可用于在基于TCP/IP的收集(如Internet)上通信。

Sockettemp=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  若要利用UDP而不是TCP,必要变动协定范例,以下面的示例所示:

Sockettemp=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
  一旦创立Socket,在客户端,你将能够经由过程Connect办法毗连到指定的服务器(你能够在Connect办法前Bind端口,就是以指定的端口倡议毗连,假如不事前Bind端标语的话,体系会默许在1024到5000随机绑定一个端标语),并经由过程Send办法向远程服务器发送数据,尔后能够经由过程Receive从服务端吸收数据;而在服务器端,你必要利用Bind办法绑定所指定的接口使Socket与一个当地闭幕点相联,并经由过程Listen办法侦听该接口上的哀求,当侦听到用户真个毗连时,挪用Accept完成毗连的操纵,创立新的Socket以处置传进的毗连哀求。利用完Socket后,利用Close办法封闭Socket。

  能够看出,以上很多办法包括EndPoint范例的参数,在Internet中,TCP/IP利用一个收集地点和一个服务端标语来独一标识设备。收集地点标识收集上的特定设备;端标语标识要毗连到的该设备上的特定服务。收集地点和服务端口的组合称为闭幕点,在.NET框架中恰是由EndPoint类暗示这个闭幕点,它供应暗示收集资本或服务的笼统,用以标记收集地点等信息。.Net同时也为每一个受撑持的地点族界说了EndPoint的子代;关于IP地点族,该类为IPEndPoint。IPEndPoint类包括使用程序毗连到主机上的服务所需的主机和端口信息,经由过程组合服务的主机IP地点和端标语,IPEndPoint类构成到服务的毗连点。
<P>  用到IPEndPoint类的时分就不成制止地触及到盘算机IP地点,System.Net定名空间中有两品种能够失掉IP地点实例:

  ・IPAddress类:IPAddress类包括盘算机在IP收集上的地点。其Parse办法可将IP地点字符串转换为IPAddress实例。上面的语句创立一个IPAddress实例:

IPAddressmyIP=IPAddress.Parse("192.168.0.1");
  必要晓得的是:Socket类撑持两种基础形式:同步和异步。其区分在于:在同步形式中,按块传输,对实行收集操纵的函数(如Send和Receive)的挪用一向比及一切内容传送操纵完成后才将把持前往给挪用程序。在异步形式中,是按位传输,必要指定发送的入手下手和停止。同步形式是最经常使用的形式,我们这里的例子也是利用同步形式。

  上面看一个完全的例子,client向server发送一段测试字符串,server吸收并显现出来,赐与client乐成呼应。

//client端
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
namespacesocketsample
{
 classClass1
 {
  staticvoidMain()
  {
   try
   {
    intport=2000;
    stringhost="127.0.0.1";
    IPAddressip=IPAddress.Parse(host);
    IPEndPointipe=newIPEndPoint(ip,port);//把ip和端口转化为IPEndPoint实例
    Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创立一个Socket
    Console.WriteLine("Conneting...");
    c.Connect(ipe);//毗连到服务器
    stringsendStr="hello!Thisisasockettest";
    byte[]bs=Encoding.ASCII.GetBytes(sendStr);
    Console.WriteLine("SendMessage");
    c.Send(bs,bs.Length,0);//发送测试信息
    stringrecvStr="";
    byte[]recvBytes=newbyte;
    intbytes;
    bytes=c.Receive(recvBytes,recvBytes.Length,0);//从服务器端承受前往信息
    recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
    Console.WriteLine("ClientGetMessage:{0}",recvStr);//显现服务器前往信息
    c.Close();
   }
   catch(ArgumentNullExceptione)
   {
    Console.WriteLine("ArgumentNullException:{0}",e);
   }
   catch(SocketExceptione)
   {
    Console.WriteLine("SocketException:{0}",e);
   }
   Console.WriteLine("PressEntertoExit");
   Console.ReadLine();
  }
 }
}
//server端
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
namespaceProject1
{
 classClass2
 {
  staticvoidMain()
  {
   try
   {
    intport=2000;
    stringhost="127.0.0.1";
    IPAddressip=IPAddress.Parse(host);
    IPEndPointipe=newIPEndPoint(ip,port);
    Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创立一个Socket类
    s.Bind(ipe);//绑定2000端口
    s.Listen(0);//入手下手监听
    Console.WriteLine("Waitforconnect");
    Sockettemp=s.Accept();//为新建毗连创立新的Socket。
    Console.WriteLine("Getaconnect");
    stringrecvStr="";
    byte[]recvBytes=newbyte;
    intbytes;
    bytes=temp.Receive(recvBytes,recvBytes.Length,0);//从客户端承受信息
    recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
    Console.WriteLine("ServerGetMessage:{0}",recvStr);//把客户端传来的信息显现出来
    stringsendStr="Ok!ClientSendMessageSucessful!";
    byte[]bs=Encoding.ASCII.GetBytes(sendStr);
    temp.Send(bs,bs.Length,0);//前往客户端乐成信息
    temp.Close();
    s.Close();
   }
   catch(ArgumentNullExceptione)
   {
    Console.WriteLine("ArgumentNullException:{0}",e);
   }
   catch(SocketExceptione)
   {
    Console.WriteLine("SocketException:{0}",e);
   }
   Console.WriteLine("PressEntertoExit");
   Console.ReadLine();
  }
 }
}
  下面的例子是用的Socket类,System.Net.Socket定名空间还供应了两个笼统初级类TCPClient和UDPClient和用于通信流处置的NetWorkStream,让我们看下例子

  客户端

TcpClienttcpClient=newTcpCLient(主机IP,端标语);
NetworkStreamns=tcp.Client.GetStream();
  服务端

TcpListenertcpListener=newTcpListener(监听端口);
tcpListener.Start();
TcpClienttcpClient=tcpListener.AcceptTcpClient();
NetworkStreamns=tcpClient.GetStream();
  服务端用TcpListener监听,然后把毗连的工具实例化为一个TcpClient,挪用TcpClient.GetStream()办法,前往收集流实例化为一个NetworlStream流,上面就是用流的办法举行Send,Receive

  假如是UdpClient的话,就间接UdpClient实例化,然后挪用UdpClient的Send和Receive办法,必要注重的事,UdpClient没有前往收集流的办法,就是说没有GetStream办法,以是没法流化,并且利用Udp通讯的时分,不要服务器监听。

  如今我们大抵懂得了.NetSocket通讯的流程,上面我们来作一个略微庞大点的程序,一个播送式的C/S谈天程序。

  客户端计划必要一个1个ListBox,用于显现谈天内容,一个TextBox输出你要说的话,一个Button发送留言,一个Button创建毗连。

  点击创建毗连的Button后出来一个对话框,提醒输出毗连服务器的IP,端口,和你的昵称,启动一个承受线程,卖力承受从服务器传来的信息并显现在ListBox下面。

  服务器端2个Button,一个启动服务,一个T失落已创建毗连的客户端,一个ListBox显现毗连上的客户真个Ip和端口。

  对照主要的中央是字符串编码的成绩,必要先把必要传送的字符串依照UTF8编码,然后承受的时分再复原成为GB2312,否则中文显现会是乱码。

  另有一个就是吸收线程,我这里复杂写成一个While(ture)轮回,不休判别是不是有信息流进,有就吸收,并显现在ListBox上,这里有成绩,在.Net2.0内里,交织线程修正窗体空间属性的时分会激发一个非常,不成以间接修正,必要界说一个托付来修正。

  当客户端必要断开毗连的时分,好比点击窗体右上角的XX,就必要界说一个this.FormClosing+=newSystem.Windows.Forms.FormClosingEventHandler(this.Closing);(.Net2.0是FormClosing体系事务),在Closing()函数内里,发送Close字符给服务端,服务器判别轮回判别一切的毗连上的客户端传来的信息,假如是以Close开首,断开与其的毗连。看到这里,读者就会问了,假如我在谈天窗口输出Close是否是也断开毗连呢?不是的,在谈天窗口输出的信息传给服务器的时分开首都要加上Ip信息和昵称,以是不会抵触。在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。

精灵巫婆 发表于 2015-1-19 21:40:54

逐步缩小出错代码段的范围,最终确定错误代码的位置。

admin 发表于 2015-1-25 10:44:12

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。

飘灵儿 发表于 2015-2-8 07:18:51

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

透明 发表于 2015-2-24 23:22:50

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

若天明 发表于 2015-3-7 13:52:22

主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。

山那边是海 发表于 2015-3-15 07:28:19

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

老尸 发表于 2015-3-21 20:46:22

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
页: [1]
查看完整版本: ASP.NET编程:C# 2.0 套接字编程实例初探