仓酷云
标题:
ASP.NET编程:C# 2.0 套接字编程实例初探
[打印本页]
作者:
活着的死人
时间:
2015-1-16 22:43
标题:
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[1024];
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[1024];
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
逐步缩小出错代码段的范围,最终确定错误代码的位置。
作者:
admin
时间:
2015-1-25 10:44
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
作者:
飘灵儿
时间:
2015-2-8 07:18
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
作者:
透明
时间:
2015-2-24 23:22
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
作者:
若天明
时间:
2015-3-7 13:52
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
作者:
山那边是海
时间:
2015-3-15 07:28
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者:
老尸
时间:
2015-3-21 20:46
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2