C#中Socket通信用法实例详解
本文实例讲述了C#中Socket通信用法。分享给大家供大家参考。具体如下:
一、UDP方式:
服务器端代码:
staticvoidMain(string[]args)
{
intrecv;
byte[]data=newbyte[1024];
IPEndPointipep=newIPEndPoint(IPAddress.Any,9050);//定义一网络端点
Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//定义一个Socket
newsock.Bind(ipep);//Socket与本地的一个终结点相关联
Console.WriteLine("Waitingforaclient..");
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="Welcometomytestserver!";
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);
}
}
客户端代码:
voidMainInfo()
{
byte[]data=newbyte[1024];//定义一个数组用来做数据的缓冲区
stringinput,stringData;
IPEndPointipep=newIPEndPoint(IPAddress.Parse("192.168.1.21"),9050);
Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
stringwelcome="Hello,areyouthere?";
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=richTextBox1.Text;//从键盘读取数据
if(input=="text")//结束标记
{
break;
}
server.SendTo(Encoding.ASCII.GetBytes(input),Remote);//将数据发送到指定的终结点Remote
data=newbyte[1024];
recv=server.ReceiveFrom(data,refRemote);//从Remote接受数据
stringData=Encoding.ASCII.GetString(data,0,recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stoppingclient");
server.Close();
}
二、TCP方式:
服务器端代码:
SocketserverSocket=null;
ThreadclientThread=null;
SocketclientSocket=null;
Threadthread=null;
IPAddressips=null;
PEndPointipep=null;
voidServerStart()
{
ips=Dns.GetHostAddresses(Dns.GetHostName())[0];
//创建IPEndPoint实例
ipep=newIPEndPoint(ips,9050);
//创建一个套接字
serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
//将所创建的套接字与IPEndPoint绑定
serverSocket.Bind(ipep);
//设置套接字为收听模式
serverSocket.Listen(20);
while(listenalive)
{
try
{
//在套接字上接收接入的连接
clientSocket=serverSocket.Accept();
clientThread=newThread(newParameterizedThreadStart(ReceiveData));
clientThread.Start(clientSocket);
}
catch(Exceptionex)
{
WriteErrorLog(ex.Message);
serverSocket.Close();
serverSocket=null;
}
}
}
staticvoidReceiveData(objectobj)
{
boolkeepalive=true;
Sockets=objasSocket;
Byte[]buffer=newByte[1024];
//根据收听到的客户端套接字向客户端发送信息
IPEndPointclientep=(IPEndPoint)s.RemoteEndPoint;
Console.WriteLine("客户端ip:"+clientep.Address+"端口:"+clientep.Port);
stringwelcome="连接服务器成功";
buffer=System.Text.Encoding.Unicode.GetBytes(welcome);
//向客户端发送“连接服务器成功”消息
s.Send(buffer,buffer.Length,SocketFlags.None);
buffer=newByte[1024];
intbufLen=0;
stringcontent=string.Empty;
while(true)
{
//在套接字上接收客户端发送的信息
bufLen=0;
try
{
bufLen=s.Receive(buffer);
if(bufLen==0)
{
break;
}
content+=System.Text.Encoding.Unicode.GetString(buffer,0,bufLen);
}
catch(Exceptionex)
{
break;;
}
}
Send(s,content);
s=null;
buffer=null;
clientep=null;
Thread.CurrentThread.Abort();
}
客户端代码:
voidSend(stringcontent)
{
byte[]data=newbyte[1024];
newclient=newSystem.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,System.Net.Sockets.SocketType.Stream,System.Net.Sockets.ProtocolType.Tcp);
ie=newSystem.Net.IPEndPoint(System.Net.IPAddress.Parse(ipadd),port);//服务器的IP和端口
try
{
//因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
newclient.Connect(ie);
}
catch(System.Net.Sockets.SocketExceptione)
{
Console.WriteLine(e.ToString());
return;
}
intrecv=newclient.Receive(data);
//连接服务器成功
stringstringdata=System.Text.Encoding.Unicode.GetString(data,0,recv);
if(stringdata=="连接服务器成功")
{
newclient.Send(System.Text.Encoding.Unicode.GetBytes(content));
newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send);
data=newbyte[1024];
recv=newclient.Receive(data);
stringresult=System.Text.Encoding.Unicode.GetString(data,0,recv);
newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
newclient.Close();
MessageBox.Show(result);
}
else
{
MessageBox.Show("连接服务器失败","友情提示");
}
}
希望本文所述对大家的C#程序设计有所帮助。