版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。C完整的通信代码点对点,点对多,同步,异步,UDP,TCP-C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP).txt20如果你努力去发现美好,美好会发现你;如果你努力去尊重他人,你也会获得别人尊重;如果你努力去帮助他人,你也会得到他人的帮助。生命就像一种回音,你送出什么它就送回什么,你播种什么就收获什么,你给予什么就得到什么。C#codenamespaceUDPServerclassProgramstaticvoidMain(stringargs)intrecv;bytedata=new
2、byte1024;/构建TCP服务器/得到本机IP,设置TCP端口号IPEndPointipep=newIPEndPoint(IPAddress.Any,8001);Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);/绑定网络地址newsock.Bind(ipep);Console.WriteLine(ThisisaServer,hostnameis0,Dns.GetHostName();/等待客户机连接Console.WriteLine(Waitingforaclient
3、.);/得到客户机IPIPEndPointsender=newIPEndPoint(IPAddress.Any,0);EndPointRemote=(EndPoint)(sender);recv=newsock.ReceiveFrom(data,refRemote);Console.WriteLine(Messagereceivedfrom0:,Remote.ToString();Console.WriteLine(Encoding.ASCII.GetString(data,0,recv);/客户机连接成功后,发送欢迎信息stringwelcome=Welcome!;/字符串与字节数组相互转换
4、data=Encoding.ASCII.GetBytes(welcome);/发送信息newsock.SendTo(data,data.Length,SocketFlags.None,Remote);while(true)data=newbyte1024;/发送接受信息recv=newsock.ReceiveFrom(data,refRemote);Console.WriteLine(Encoding.ASCII.GetString(data,0,recv);newsock.SendTo(data,recv,SocketFlags.None,Remote);C#codeusingSystem;
5、usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceUDPClientclassProgramstaticvoidMain(stringargs)bytedata=newbyte1024;stringinput,stringData;/构建TCP服务器Console.WriteLine(ThisisaClient,hostnameis0,Dns.GetHostName();/设置服务IP,设置TCP端口号IPEndPo
6、intipep=newIPEndPoint(IPAddress.Parse(),8001);/定义网络类型,数据连接类型和网络协议UDPSocketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);stringwelcome=Hello!;data=Encoding.ASCII.GetBytes(welcome);server.SendTo(data,data.Length,SocketFlags.None,ipep);IPEndPointsender=newIPEndPoint(IPA
7、ddress.Any,0);EndPointRemote=(EndPoint)sender;data=newbyte1024;intrecv=server.ReceiveFrom(data,refRemote);Console.WriteLine(Messagereceivedfrom0:,Remote.ToString();Console.WriteLine(Encoding.ASCII.GetString(data,0,recv);while(true)input=Console.ReadLine();if(input=exit)break;server.SendTo(Encoding.A
8、SCII.GetBytes(input),Remote);data=newbyte1024;recv=server.ReceiveFrom(data,refRemote);stringData=Encoding.ASCII.GetString(data,0,recv);Console.WriteLine(stringData);Console.WriteLine(StoppingClient.);server.Close();C#codeTCPClientTCPClient类提供了一种使用TCP协议连接到某个端点的简化方法。它还通过NetworkStream对象展现在连接过程中读取或写入的数据
9、。请参见下面从QuickStart文档中摘录的日期/时间客户机示例。使用C#编写usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.IO;usingSystem.Text;classClientpublicstaticvoidMain(Stringargs)TCPClienttcpc=newTCPClient();Byteread=newByte32;if(args.Length!=1)Console.WriteLine(“请在命令行中指定服务器名称”);return;Stringserver=args0;/验证服务器
10、是否存在if(DNS.GetHostByName(server)=null)Console.WriteLine(“找不到服务器:”+服务器);return;/尝试连接到服务器if(tcpc.Connect(server,13)=-1)Console.WriteLine(“无法连接到服务器:”+服务器);return;/获取流Streams=tcpc.GetStream();/读取流并将它转换为ASCII码形式intbytes=s.Read(read,0,read.Length);StringTime=Encoding.ASCII.GetString(read);/显示数据Console.Wri
11、teLine(“已接收到的”+字节+“字节”);Console.WriteLine(“当前日期和时间是:”+时间);tcpc.Close();TCPListenerTCPListener类便于在来自某个客户机的TCP连接的特定套接字上进行侦听的工作。请参见下面包括在QuickStart文档中的日期/时间服务器示例。使用C#编写usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;classServerpublicstaticvoidMain()DateTimenow;StringstrDateLine;Enco
12、dingASCII=Encoding.ASCII;/在端口13进行侦听TCPListenertcpl=newTCPListener(13);tcpl.Start();Console.WriteLine(“正在等待客户进行连接”);Console.WriteLine(“请按Ctrl+c退出.”);while(true)/接收会阻塞,直到有人连接上Sockets=tcpl.Accept();/获取当前的日期和时间并将它连接成一个字符串now=DateTime.Now;strDateLine=now.ToShortDateString()+now.ToLongTimeString();/将该字符串转
13、换成一个字节数组并发送它BytebyteDateLine=ASCII.GetBytes(strDateLine.ToCharArray();s.Send(byteDateLine,byteDateLine.Length,0);Console.WriteLine(“发送”+strDateLine);#regionDownload:FiletransferFROMftpserver/CopyafilefromFTPservertolocal/Targetfilename,ifrequired/Fullpathofthelocalfile/Targetcanbeblank(usesamefilena
14、me),orjustafilename/(assumescurrentdirectory)orafullpathandfilenamepublicboolDownload(stringsourceFilename,stringlocalFilename,boolPermitOverwrite)/2.determinetargetfileFileInfofi=newFileInfo(localFilename);returnthis.Download(sourceFilename,fi,PermitOverwrite);/VersiontakinganFtpFileInfopublicboolD
15、ownload(FtpFileInfofile,stringlocalFilename,boolpermitOverwrite)returnthis.Download(file.FullName,localFilename,permitOverwrite);/AnotherversiontakingFtpFileInfoandFileInfopublicboolDownload(FtpFileInfofile,FileInfolocalFI,boolpermitOverwrite)returnthis.Download(file.FullName,localFI,permitOverwrite
16、);/Versiontakingstring/FileInfopublicboolDownload(stringsourceFilename,FileInfotargetFI,boolpermitOverwrite)/1.checktargetif(targetFI.Exists&!(permitOverwrite)throw(newApplicationException(Targetfilealreadyexists);/2.checksourcestringtarget;if(sourceFilename.Trim()=)throw(newApplicationException(Fil
17、enotspecified);elseif(sourceFilename.Contains(/)/treatasafullpathtarget=AdjustDir(sourceFilename);else/treatasfilenameonly,usecurrentdirectorytarget=CurrentDirectory+sourceFilename;stringURI=Hostname+target;/3.performcopySystem.Net.FtpWebRequestftp=GetRequest(URI);/Setrequesttodownloadafileinbinarym
18、odeftp.Method=System.Net.WebRequestMethods.Ftp.DownloadFile;ftp.UseBinary=true;/openrequestandgetresponsestreamusing(FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse()using(StreamresponseStream=response.GetResponseStream()/looptoread&writetofileusing(FileStreamfs=targetFI.OpenWrite()trybytebuf
19、fer=newbyte2048;intread=0;doread=responseStream.Read(buffer,0,buffer.Length);fs.Write(buffer,0,read);while(!(read=0);responseStream.Close();fs.Flush();fs.Close();catch(Exception)/catcherroranddeletefileonlypartiallydownloadedfs.Close();/deletetargetfileasitsincompletetargetFI.Delete();throw;response
20、Stream.Close();response.Close();returntrue;#endregion简单的UDP收发.发送C#codetrySockets=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);/向此网段发广播包intUDPListenerPort=8082;IPAddressbroadcast=IPAddress.Parse(55);/此处根据IP及子网掩码改为相应的广播IPstringts=ThisisUPDstringforsending;bytesendbuf=Encodin
21、g.ASCII.GetBytes(ts);IPEndPointep=newIPEndPoint(broadcast,UDPListenerPort);s.SendTo(sendbuf,ep);catch(Exceptione)接收C#codeUdpClientlistener;intUDPListenerPort=8082;IPEndPointgroupEP=newIPEndPoint(IPAddress.Any,UDPListenerPort);trywhile(true)bytebytes=listener.Receive(refgroupEP);stringRecIP=groupEP.T
22、oString().Substring(0,groupEP.ToString().IndexOf(:);/收到发送UPD端的IPstringRecStr=Encoding.ASCII.GetString(bytes,0,bytes.Length);/收到的UPD字符串catchC#codeTCPClientTCPClient类提供了一种使用TCP协议连接到某个端点的简化方法。它还通过NetworkStream对象展现在连接过程中读取或写入的数据。请参见下面从QuickStart文档中摘录的日期/时间客户机示例。使用C#编写usingSystem;usingSystem.Net;usingSys
23、tem.Net.Sockets;usingSystem.IO;usingSystem.Text;classClientpublicstaticvoidMain(Stringargs)TCPClienttcpc=newT来一个Remoting的:C#codeusingSystem;namespaceRemotablepublicclassRemotableType:MarshalByRefObjectprivatestring_internalString=ThisistheRemotableType.;publicstringStringMethod()return_internalStrin
24、g;usingSystem;usingSystem.Runtime.Remoting;namespaceRemotingFirstpublicclassListenerpublicstaticvoidMain()RemotingConfiguration.Configure(Listener.exe.config);Console.WriteLine(Listeningforrequests.PressEntertoexit);Console.ReadLine();usingSystem;usingSystem.Runtime.Remoting;namespaceClientpubliccla
25、ssClientpublicstaticvoidMain()RemotingConfiguration.Configure(Client.exe.config);Remotable.RemotableTyperemoteObject=newRemotable.RemotableType();Console.WriteLine(remoteObject.StringMethod();Listener.exe.config实只要用到Socket联接,基本上就得使用Thread,是交叉使用的。C#封装的Socket用法基本上不算很复杂,只是不知道托管之后的Socket有没有其他性能或者安全上的问题。
26、在C#里面能找到的最底层的操作也就是socket了,概念不做解释。程序模型如下:WinForm程序:启动端口侦听;监视Socket联接情况;定期关闭不活动的联接;Listener:处理Socket的Accept函数,侦听新链接,建立新Thread来处理这些联接(Connection)。Connection:处理具体的每一个联接的会话。1:WinForm如何启动一个新的线程来启动Listener:/starttheserverprivatevoidbtn_startServer_Click(objectsender,EventArgse)/this.btn_startServer.Enabled
27、=false;Thread_createServer=newThread(newThreadStart(WaitForConnect);_createServer.Start();/waitallconnectionsprivatevoidWaitForConnect()SocketListenerlistener=newSocketListener(Convert.ToInt32(this.txt_port.Text);listener.StartListening();因为侦听联接是一个循环等待的函数,所以不可能在WinForm的线程里面直接执行,不然Winform也就是无法继续任何操作了
28、,所以才指定一个新的线程来执行这个函数,启动侦听循环。这一个新的线程是比较简单的,基本上没有启动的参数,直接指定处理函数就可以了。2:Listener如何启动循环侦听,并且启动新的带有参数的线程来处理Socket联接会话。先看如何建立侦听:(StartListening函数)IPEndPointlocalEndPoint=newIPEndPoint(_ipAddress,_port);/CreateaTCP/IPsocket.Socketlistener=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tc
29、p);/Bindthesockettothelocalendpointandlistenforincomingconnections.trylistener.Bind(localEndPoint);listener.Listen(20);/20trucks/Startlisteningforconnections.while(true)/herewillbesuspendedwhilewaitingforanewconnection.Socketconnection=listener.Accept();Logger.Log(Connect,connection.RemoteEndPoint.T
30、oString();/logit,newconnection基本步骤比较简单:建立本机的IPEndPoint对象,表示以本机为服务器,在指定端口侦听;然后绑定到一个侦听Socket上;进入while循环,等待新的联接;如果有新的联接,那么建立新的socket来对应这个联接的会话。值得注意的就是这一句联接代码:listener.Accept()。执行这一句的时候,程序就在这个地方等待,直到有新的联检请求的时候程序才会执行下一句。这是同步执行,当然也可以异步执行。新的联接Socket建立了(Accept之后),对于这些新的socket该怎么办呢?他们依然是一个循环等待,所以依然需要建立新的Thre
31、ad给这些Socket去处理会话(接收/发送消息),而这个Thread就要接收参数了。Thread本身是不能接收参数的,为了让它可以接收参数,可以采用定义新类,添加参数作为属性的方法来解决。因为每一个Socket是一个Connection周期,所以我定义了这么一个类publicclassConnection。这个类至少有这样一个构造函数publicConnection(Socketsocket);之所以这么做,就是为了把Socket参数传给这个Connection对象,然后好让Listener启动这个Thread的时候,Thread可以知道他正在处理哪一个Socket。具体处理的方法:(在Li
32、stener的StartListening函数,ocketconnection=listener.Accept();之后)ConnectiongpsCn=newConnection(connection);/eachsocketwillbewaitfordata.keeptheconnection.Threadthread=newThread(newThreadStart(gpsCn.WaitForSendData);thread.Name=connection.RemoteEndPoint.ToString();thread.Start();如此一来,这个新的socket在Accept之后就
33、在新的Thread中运行了。3:Connection的会话处理建立了新的Connection(也就是socket),远程就可以和这个socket进行会话了,无非就是send和receive。现在先看看怎么写的这个线程运行的Connection.WaitForSendData函数while(true)bytes=newbyte1024;stringdata=;/systmwillbewaitingthemsgofreceiveenvet.likeAccept();/bytesRec=this
34、._connection.Receive(bytes);_lastConnectTime=DateTime.Now;if(bytesRec=0)/closeenventLogger.Log(CloseConnection,_connection.RemoteEndPoint.ToString();break;data+=Encoding.ASCII.GetString(bytes,0,bytesRec);/.handleyourdata.可以看到这个处理的基本步骤如下:执行Receive函数,接收远程socket发送的信息;把信息从字节转换到string;处理该信息,然后进入下一个循环,继续等
35、待socket发送新的信息。值得注意的有几个:1:Receive函数。这个函数和Listener的Accept函数类似。在这个地方等待执行,如果没有新的消息,这个函数就不会执行下一句,一直等待。2:接收的是字节流,需要转化成字符串3:判断远程关闭联接的方式4:如果对方的消息非常大,还得循环接收这个data。4:如何管理这些联接(thread)通过上边的程序,基本上可以建立一个侦听,并且处理联接会话。但是如何管理这些thread呢?不然大量产生thread可是一个灾难。管理的方法比较简单,在Listener里面我定义了一个静态的哈希表(staticpublicHashtableConnectio
36、ns=newHashtable();),存储Connection实例和它对应的Thread实例。而connection中也加入了一个最后联接时间的定义(privateDateTime_lastConnectTime;)。在新链接建立的时候(Listener的Accept()之后)就把Connection实例和Thread实例存到哈希表中;在Connection的Receive的时候修改最后联接时间。这样我们就可以知道该Connection在哪里,并且会话是否活跃。然后在Winform程序里头可以管理这些会话了,设置设置超时。在网络环境下,我们最感兴趣的两个命名空间是System.Net和Sys
37、tem.Net.Sockets。System.Net命名空间通常与较高程的操作有关,例如download或upload,试用HTTP和其他协议进行Web请求等等,而System.Net.Sockets命名空间所包含的类通常与较低程的操作有关。如果要直接使用Sockets或者TCP/IP之类的协议,这个命名空间的类是非常有用的。在.Net中,System.Net.Sockets命名空间为需要严密控制网络访问的开发人员提供了WindowsSockets(Winsock)接口的托管实现。System.Net命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TC
38、PListener和UDPClient类封装有关创建到Internet的TCP和UDP连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。可见,在应用程序端或者服务器端创建了Socket对象之后,就可
39、以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据。针对Socket编程,.NET框架的Socket类是Winsock32API提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket类方法只是将数据封送到它们的本机Win32副本中并处理任何必要的安全检查。如果你熟悉WinsockAPI函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用Socket类开发windows网络应用程序原来有规可寻,它们在
40、大多数情况下遵循大致相同的步骤。在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:publicSocket(AddressFamilyaddressFamily,SocketTypesocketType,ProtocolTypeprotocolType);其中,addressFamily参数指定Socket使用的寻址方案,socketType参数指定Socket的类型,protocolType参数指定Socket使用的协议。下面的示例语句创建一个Socket,它可用于在基于TCP/IP的网络(如Internet)上通讯。Sockettemp=newSo
41、cket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);若要使用UDP而不是TCP,需要更改协议类型,如下面的示例所示:Sockettemp=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);一旦创建Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bin
42、d方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完Socket后,记住使用Shutdown方法禁用Socket,并使用Close方法关闭Socket。可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在.NET框架中正是由EndPoint类表示这个终结点
43、,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了EndPoint的子代;对于IP地址族,该类为IPEndPoint。IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,System.Net命名空间中有两种类可以得到IP地址实例:IPAddress类:IPAddress类包含计算机在IP网络上的地址。其Parse方法可将IP地址字符串转换为IPAddress实例。下面的语句创建一个I
44、PAddress实例:IPAddressmyIP=IPAddress.Parse();Dns类:向使用TCP/IPInternet服务的应用程序提供域名服务。其Resolve方法查询DNS服务器以将用户友好的域名(如)映射到数字形式的Internet地址(如)。Resolve方法返回一个IPHostEnty实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用AddressList数组中返回的第一个地址。下面的代码获取一个IPAddress实例,该实例包含服务器的IP地址。IPHostEntryipHostInfo=Dns.Resolve();IPAddressipAddress
45、=ipHostInfo.AddressList0;你也可以使用GetHostName方法得到IPHostEntry实例:IPHosntEntryhostInfo=Dns.GetHostByName()在使用以上方法时,你将可能需要处理以下几种异常:SocketException异常:访问Socket时操作系统发生错误引发ArgumentNullException异常:参数为空引用引发ObjectDisposedException异常:Socket已经关闭引发在掌握上面得知识后,下面的代码将该服务器主机(的IP地址与端口号组合,以便为连接创建远程终结点:IPEndPointipe=newIPEn
46、dPoint(ipAddress,11000);确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的IPEndPoint实例与远程设备连接,并捕获可能引发的异常:trytemp.Connect(ipe);/尝试连接/处理参数为空引用异常catch(ArgumentNullExceptionae)Console.WriteLine(ArgumentNullException:0,ae.ToString();/处理操作系统异常catch(SocketExceptionse)Console.WriteLine(SocketException:0,s
47、e.ToString();需要知道的是:Socket类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如Send和Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。综合运用以上阐述的使用VisualC#进行Socket网络程序开发的知识,下面的程序是一个简单的Socket通讯实例,client向server发送一段测试字符串,server接收并显示出来,给予client成功相应。/client端usingSystem;usingSystem.Text;usingSystem.IO;usingSystem.Net;usi
48、ngSystem.Net.Sockets;namespacesocketsampleclassClass1staticvoidMain()tryintport=2000;stringhost=;IPAddressip=IPAddress.Parse(host);IPEndPointipe=newIPEndPoint(ip,port);Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);c.Connect(ipe);stringsendStr=hello!Thisisasockettes
49、t;bytebs=Encoding.ASCII.GetBytes(sendStr);c.Send(bs,bs.Length,0);stringrecvStr=;byterecvBytes=newbyte1024;intbytes;bytes=c.Receive(recvBytes,recvBytes.Length,0);recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);Console.WriteLine(recvStr);c.Close();catch(ArgumentNullExceptione)Console.WriteLine(Ar
50、gumentNullException:0,e);catch(SocketExceptione)Console.WriteLine(SocketException:0,e);Console.ReadLine();/server端usingSystem;usingSystem.Text;usingSystem.IO;usingSystem.Net;usingSystem.Net.Sockets;namespaceProject1classClass2staticvoidMain()tryintport=2000;stringhost=;IPAddressip=IPAddress.Parse(ho
51、st);IPEndPointipe=newIPEndPoint(ip,port);Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);s.Bind(ipe);s.Listen(0);Sockettemp=s.Accept();stringrecvStr=;byterecvBytes=newbyte1024;intbytes;bytes=temp.Receive(recvBytes,recvBytes.Length,0);recvStr+=Encoding.ASCII.GetString
52、(recvBytes,0,bytes);Console.WriteLine(recvStr);stringsendStr=Ok!Sucess!;bytebs=Encoding.ASCII.GetBytes(sendStr);temp.Send(bs,bs.Length,0);temp.Shutdown(SocketShutdown.Both);temp.Close();s.Shutdown(SocketShutdown.Both);s.Close();catch(ArgumentNullExceptione)Console.WriteLine(ArgumentNullException:0,e
53、);catch(SocketExceptione)Console.WriteLine(SocketException:0,e);Console.ReadLine();以上程序在VSExpress2005.Net2.0环境下测试通过。C#UDP的多路广播组的发送和接收下列范例使用UdpClient,在通讯端口11000传送UDP资料包至多点传送位址群组224.268.100.2。它传送命令列上指定的信息字串。C#codeusingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;publicclassUDPMultic
54、astSenderprivatestaticIPAddressGroupAddress=IPAddress.Parse();privatestaticintGroupPort=11000;privatestaticvoidSend(Stringmessage)UdpClientsender=newUdpClient();IPEndPointgroupEP=newIPEndPoint(GroupAddress,GroupPort);tryConsole.WriteLine(Sendingdatagram:0,message);bytebytes=Encoding.ASCII.GetBytes(m
55、essage);sender.Send(bytes,bytes.Length,groupEP);sender.Close();catch(Exceptione)Console.WriteLine(e.ToString();publicstaticintMain(Stringargs)Send(args0);return0;下列范例使用UdpClient,在通讯端口11000监听广播到多点传送位址群组的UDP资料包。它接收信息字串,并將信息写入主控台(Console)。C#codeusingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingS
56、ystem.Text;publicclassUDPMulticastListenerprivatestaticreadonlyIPAddressGroupAddress=IPAddress.Parse();privateconstintGroupPort=11000;privatestaticvoidStartListener()booldone=false;UdpClientlistener=newUdpClient();IPEndPointgroupEP=newIPEndPoint(GroupAddress,GroupPort);trylistener.JoinMulticastGroup
57、(GroupAddress);listener.Connect(groupEP);while(!done)Console.WriteLine(Waitingforbroadcast);bytebytes=listener.Receive(refgroupEP);Console.WriteLine(Receivedbroadcastfrom0:n1n,groupEP.ToString(),Encoding.ASCII.GetString(bytes,0,bytes.Length);listener.Close();catch(Exceptione)Console.WriteLine(e.ToSt
58、ring();publicstaticintMain(Stringargs)StartListener();return0;usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;publicclassUDPMulticastSenderprivatestaticIPAddressGroupAddress=IPAddress.Parse();privatestaticintGroupPort=11000;privatestaticvoidSend(Stringmessage)UdpClientsender=new
59、UdpClient();IPEndPointgroupEP=newIPEndPoint(GroupAddress,GroupPort);tryConsole.WriteLine(Sendingdatagram:0,message);bytebytes=Encoding.ASCII.GetBytes(message);sender.Send(bytes,bytes.Length,groupEP);sender.Close();catch(Exceptione)Console.WriteLine(e.ToString();publicstaticintMain(Stringargs)Send(ar
60、gs0);return0;C#codetryUdpClientudp=newUdpClient(newIPEndPoint(ipAddress,startPort+i);udp.Close();unUsedPort=startPort+i;break;catchusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Collec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沪教版三年级下册数学第二单元 用两位数乘除 测试卷含答案(达标题)
- 国画基础学教案
- 暑假的学习计划(16篇)
- 湖北省襄阳市2023-2024学年高一上学期期末考试化学试题(含答案)
- 评估服务委托合同
- 诚信承诺声明
- 详细保证书模板保证心得
- 语文大专辩论赛评分卷
- 财务收款确认书
- 质量守则系统保证书
- 长输管道工程施工组织设计
- 工程管理前沿论文
- 高中历史华东师大版(试验本)高一上册第三单元古代希腊罗马-美苏争锋
- 保险医学课件
- 北京市东城区2021-2022学年高二下学期期末考试英语试卷
- 高同型半胱氨酸血症诊疗指南
- 青岛版六三制四年级上册数学1速度、时间和路程教学课件
- 《二外西班牙语1》课程教学大纲
- (最新)医疗技术操作规范
- 高速铁路梁体的预制、运输及架设施工技术总结
- 风险投资课件(PPT 72页)
评论
0/150
提交评论