C#完整的通信代码点对点点对多同步异步UDPTCP.docx
《C#完整的通信代码点对点点对多同步异步UDPTCP.docx》由会员分享,可在线阅读,更多相关《C#完整的通信代码点对点点对多同步异步UDPTCP.docx(50页珍藏版)》请在冰豆网上搜索。
C#完整的通信代码点对点点对多同步异步UDPTCP
C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP).txt20如果你努力去发现美好,美好会发现你;如果你努力去尊重他人,你也会获得别人尊重;如果你努力去帮助他人,你也会得到他人的帮助。
生命就像一种回音,你送出什么它就送回什么,你播种什么就收获什么,你给予什么就得到什么。
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用