C#完整的通信代码点对点点对多同步异步UDPTCP.docx

上传人:b****6 文档编号:6675516 上传时间:2023-01-08 格式:DOCX 页数:42 大小:32.07KB
下载 相关 举报
C#完整的通信代码点对点点对多同步异步UDPTCP.docx_第1页
第1页 / 共42页
C#完整的通信代码点对点点对多同步异步UDPTCP.docx_第2页
第2页 / 共42页
C#完整的通信代码点对点点对多同步异步UDPTCP.docx_第3页
第3页 / 共42页
C#完整的通信代码点对点点对多同步异步UDPTCP.docx_第4页
第4页 / 共42页
C#完整的通信代码点对点点对多同步异步UDPTCP.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

C#完整的通信代码点对点点对多同步异步UDPTCP.docx

《C#完整的通信代码点对点点对多同步异步UDPTCP.docx》由会员分享,可在线阅读,更多相关《C#完整的通信代码点对点点对多同步异步UDPTCP.docx(42页珍藏版)》请在冰豆网上搜索。

C#完整的通信代码点对点点对多同步异步UDPTCP.docx

C#完整的通信代码点对点点对多同步异步UDPTCP

C#code

namespaceUDPServer

{

classProgram

{

staticvoidMain(string[]args)

{

intrecv;

byte[]data=newbyte[1024];

//构建TCP服务器

//得到本机IP,设置TCP端口号

IPEndPointipep=newIPEndPoint(IPAddress.Any,8001);

Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

//绑定网络地址

newsock.Bind(ipep);

Console.WriteLine("ThisisaServer,hostnameis{0}",Dns.GetHostName());

//等待客户机连接

Console.WriteLine("Waitingforaclient...");

//得到客户机IP

IPEndPointsender=newIPEndPoint(IPAddress.Any,0);

EndPointRemote=(EndPoint)(sender);

recv=newsock.ReceiveFrom(data,refRemote);

Console.WriteLine("Messagereceivedfrom{0}:

",Remote.ToString());

Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));

//客户机连接成功后,发送欢迎信息

stringwelcome="Welcome!

";

//字符串与字节数组相互转换

data=Encoding.ASCII.GetBytes(welcome);

//发送信息

newsock.SendTo(data,data.Length,SocketFlags.None,Remote);

while(true)

{

data=newbyte[1024];

//发送接受信息

recv=newsock.ReceiveFrom(data,refRemote);

Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));

newsock.SendTo(data,recv,SocketFlags.None,Remote);

}

}

}

}

C#code

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Net;

usingSystem.Net.Sockets;

namespaceUDPClient

{

classProgram

{

staticvoidMain(string[]args)

{

byte[]data=newbyte[1024];

stringinput,stringData;

//构建TCP服务器

Console.WriteLine("ThisisaClient,hostnameis{0}",Dns.GetHostName());

//设置服务IP,设置TCP端口号

IPEndPointipep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),8001);

//定义网络类型,数据连接类型和网络协议UDP

Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

stringwelcome="Hello!

";

data=Encoding.ASCII.GetBytes(welcome);

server.SendTo(data,data.Length,SocketFlags.None,ipep);

IPEndPointsender=newIPEndPoint(IPAddress.Any,0);

EndPointRemote=(EndPoint)sender;

data=newbyte[1024];

intrecv=server.ReceiveFrom(data,refRemote);

Console.WriteLine("Messagereceivedfrom{0}:

",Remote.ToString());

Console.WriteLine(Encoding.ASCII.GetString(data,0,recv));

while(true)

{

input=Console.ReadLine();

if(input=="exit")

break;

server.SendTo(Encoding.ASCII.GetBytes(input),Remote);

data=newbyte[1024];

recv=server.ReceiveFrom(data,refRemote);

stringData=Encoding.ASCII.GetString(data,0,recv);

Console.WriteLine(stringData);

}

Console.WriteLine("StoppingClient.");

server.Close();

}

}

}

C#code

TCPClient

TCPClient类提供了一种使用TCP协议连接到某个端点的简化方法。

它还通过NetworkStream对象展现在连接过程中读取或写入的数据。

请参见下面从QuickStart文档中摘录的日期/时间客户机示例。

使用C#编写

usingSystem;

usingSystem.Net;

usingSystem.Net.Sockets;

usingSystem.IO;

usingSystem.Text;

classClient

{

publicstaticvoidMain(String[]args)

{

TCPClienttcpc=newTCPClient();

Byte[]read=newByte[32];

if(args.Length!

=1)

{

Console.WriteLine(“请在命令行中指定服务器名称”);

return;

}

Stringserver=args[0];

//验证服务器是否存在

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.WriteLine(“已接收到的”+字节+“字节”);

Console.WriteLine(“当前日期和时间是:

”+时间);

tcpc.Close();

}

}

TCPListener

TCPListener类便于在来自某个客户机的TCP连接的特定套接字上进行侦听的工作。

请参见下面包括在QuickStart文档中的日期/时间服务器示例。

使用C#编写

usingSystem;

usingSystem.Net;

usingSystem.Net.Sockets;

usingSystem.Text;

classServer

{

publicstaticvoidMain()

{

DateTimenow;

StringstrDateLine;

EncodingASCII=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();

//将该字符串转换成一个字节数组并发送它

Byte[]byteDateLine=

ASCII.GetBytes(strDateLine.ToCharArray());

s.Send(byteDateLine,byteDateLine.Length,0);

Console.WriteLine(“发送”+strDateLine);

}

}

}

#region"Download:

FiletransferFROMftpserver"

///

///CopyafilefromFTPservertolocal

///

///Targetfilename,ifrequired

///Fullpathofthelocalfile

///

///Targetcanbeblank(usesamefilename),orjustafilename

///(assumescurrentdirectory)orafullpathandfilename

publicboolDownload(stringsourceFilename,stringlocalFilename,boolPermitOverwrite)

{

//2.determinetargetfile

FileInfofi=newFileInfo(localFilename);

returnthis.Download(sourceFilename,fi,PermitOverwrite);

}

//VersiontakinganFtpFileInfo

publicboolDownload(FtpFileInfofile,stringlocalFilename,boolpermitOverwrite)

{

returnthis.Download(file.FullName,localFilename,permitOverwrite);

}

//AnotherversiontakingFtpFileInfoandFileInfo

publicboolDownload(FtpFileInfofile,FileInfolocalFI,boolpermitOverwrite)

{

returnthis.Download(file.FullName,localFI,permitOverwrite);

}

//Versiontakingstring/FileInfo

publicboolDownload(stringsourceFilename,FileInfotargetFI,boolpermitOverwrite)

{

//1.checktarget

if(targetFI.Exists&&!

(permitOverwrite))

{

throw(newApplicationException("Targetfilealreadyexists"));

}

//2.checksource

stringtarget;

if(sourceFilename.Trim()=="")

{

throw(newApplicationException("Filenotspecified"));

}

elseif(sourceFilename.Contains("/"))

{

//treatasafullpath

target=AdjustDir(sourceFilename);

}

else

{

//treatasfilenameonly,usecurrentdirectory

target=CurrentDirectory+sourceFilename;

}

stringURI=Hostname+target;

//3.performcopy

System.Net.FtpWebRequestftp=GetRequest(URI);

//Setrequesttodownloadafileinbinarymode

ftp.Method=System.Net.WebRequestMethods.Ftp.DownloadFile;

ftp.UseBinary=true;

//openrequestandgetresponsestream

using(FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse())

{

using(StreamresponseStream=response.GetResponseStream())

{

//looptoread&writetofile

using(FileStreamfs=targetFI.OpenWrite())

{

try

{

byte[]buffer=newbyte[2048];

intread=0;

do

{

read=responseStream.Read(buffer,0,buffer.Length);

fs.Write(buffer,0,read);

}while(!

(read==0));

responseStream.Close();

fs.Flush();

fs.Close();

}

catch(Exception)

{

//catcherroranddeletefileonlypartiallydownloaded

fs.Close();

//deletetargetfileasit'sincomplete

targetFI.Delete();

throw;

}

}

responseStream.Close();

}

response.Close();

}

returntrue;

}

#endregion

简单的UDP收发.

发送

C#code

try

{

Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//向此网段发广播包

intUDPListenerPort=8082;

IPAddressbroadcast=IPAddress.Parse("192.168.0.255");//此处根据IP及子网掩码改为相应的广播IP

stringts="ThisisUPDstringforsending";

byte[]sendbuf=Encoding.ASCII.GetBytes(ts);

IPEndPointep=newIPEndPoint(broadcast,UDPListenerPort);

s.SendTo(sendbuf,ep);

}

catch(Exceptione)

{}

接收

C#code

UdpClientlistener;

intUDPListenerPort=8082;

IPEndPointgroupEP=newIPEndPoint(IPAddress.Any,UDPListenerPort);

try

{

while(true)

{

byte[]bytes=listener.Receive(refgroupEP);

stringRecIP=groupEP.ToString().Substring(0,groupEP.ToString().IndexOf(":

"));//收到发送UPD端的IP

stringRecStr=Encoding.ASCII.GetString(bytes,0,bytes.Length);//收到的UPD字符串

}

}

catch

{}

C#code

TCPClient

TCPClient类提供了一种使用TCP协议连接到某个端点的简化方法。

它还通过NetworkStream对象展现在连接过程中读取或写入的数据。

请参见下面从QuickStart文档中摘录的日期/时间客户机示例。

使用C#编写

usingSystem;

usingSystem.Net;

usingSystem.Net.Sockets;

usingSystem.IO;

usingSystem.Text;

classClient

{

publicstaticvoidMain(String[]args)

{

TCPClienttcpc=newT…

来一个Remoting的:

C#code

usingSystem;

namespaceRemotable

{

publicclassRemotableType:

MarshalByRefObject

{

privatestring_internalString="ThisistheRemotableType.";

publicstringStringMethod()

{

return_internalString;

}

}

}

usingSystem;

usingSystem.Runtime.Remoting;

namespaceRemotingFirst

{

publicclassListener

{

publicstaticvoidMain()

{

RemotingConfiguration.Configure("Listener.exe.config");

Console.WriteLine("Listeningforrequests.PressEntertoexit");

Console.ReadLine();

}

}

}

usingSystem;

usingSystem.Runtime.Remoting;

namespaceClient

{

publicclassClient

{

publicstaticvoidMain()

{

RemotingConfiguration.Configure("Client.exe.config");

Remotable.RemotableTyperemoteObject=newRemotable.RemotableType();

Console.WriteLine(remoteObject.StringMethod());

}

}

}

Listener.exe.config

xmlversion="1.0"encoding="utf-8"?

>

mode="Singleton"

type="Remotable.RemotableType,RemotableType"

objectUri="RemotableType.rem"

/>

实只要用到Socket联接,基本上就得使用Thread,是交叉使用的。

C#封装的Socket用法基本上不算很复杂,只是不知道托管之后的Socket有没有其他性能或者安全上的问题。

在C#里面能找到的最底层的操作也就是socket了,概念不做解释。

程序模型如下:

WinForm程序:

启动端口侦听;监视Socket联接情况;定期关闭不活动的联接;

Listen

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1