C# Socket UDP 案例 1


 
UDP的簡單應用:
         由於UDP是一種無連接的協議。因此,為了使服務器應用能夠發送和接收UDP數據包,則需要做兩件事情:
         創建一個Socket對象;
         將創建的套接字對象與本地IPEndPoint進行綁定。
         完成上述步驟后,那么創建的套接字就能夠在IPEndPoint上接收流入的UDP數據包,或者將流出的UDP數據包發送到網絡中任意其他設備商。使用UDP進行通信時,不需要TCP連接。因為異地的主機之間沒有建立連接,所以UDP不能使用標准的Send()和Receive()t套接字方法,而是使用兩個其他的方法:SendTo()和ReceiveFrom()。
        SendTo()方法指定要發送的數據,和目標機器的IPEndPoint。該方法有多種不同的使用方法,可以根據具體的應用進行選擇,但是至少要指定數據包和目標機器。如下:
        SendTo(byte[] data,EndPoint Remote)
        ReceiveFrom()方法同SendTo()方法類似,但是使用EndPoint對象聲明的方式不一樣。利用ref修飾,傳遞的不是一個EndPoint對象,而是將參數傳遞給一個EndPoint對象。

服務器端:

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPServer
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024];

//構建UDP服務器

//得到本機IP,設置UDP端口號
IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram , ProtocolType.Udp);

//綁定網絡地址
newsock.Bind(ipep);

Console.WriteLine("This is a Server, host name is {0}",Dns.GetHostName());

//等待客戶機連接
Console.WriteLine("Waiting for a client");

//得到客戶機IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console .WriteLine ("Message received from {0}: ", Remote.ToString ());
Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv ));

//客戶機連接成功后,發送歡迎信息
string welcome = "Welcome ! ";

//字符串與字節數組相互轉換
data = Encoding .ASCII .GetBytes (welcome );

//發送信息
newsock .SendTo (data ,data.Length ,SocketFlags .None ,Remote );
while (true )
{
data =new byte [1024];
//發送接受信息
recv =newsock.ReceiveFrom(data ,ref Remote);
Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv));
newsock .SendTo (data ,recv ,SocketFlags .None ,Remote );
}
}

}
}

客戶端:

(UDP客戶機程序與服務器程序非常類似。 因為客戶機不需要在指定的UDP端口等待流入的數據,因此,不使用Bind()方法,而是使用在數據發送時系統隨機指定的一個UDP端口,而且使用同一個端口接收返回的消息。在看法產品時,要為客戶機指定一套UDP端口,以便服務器和客戶機程序使用相同的端口號。UDP客戶機程序首先定義一個IPEndPoint,UDP服務器將發送數據包到這個IPEndPoint。如果在遠程設備上運行UDP服務器程序,在IPEndPoint定義中必須輸入適當的IP地址和UDP端口號信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input ,stringData;

//構建UDP服務器

Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());

//設置服務IP,設置UDP端口號
IPEndPoint ipep = new IPEndPoint(IPAddress .Parse ("127.0.0.1") , 8001);

//定義網絡類型,數據連接類型和網絡協議UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

string welcome = "Hello! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;

data = new byte[1024];
//對於不存在的IP地址,加入此行代碼后,可以在指定時間內解除阻塞模式限制
//server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {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 = new byte [1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console .WriteLine ("Stopping Client.");
server .Close ();
}

}
}


以上摘自:一路前行:http://www.cnblogs.com/zhangpengshou/archive/2008/10/09/1307622.html 

      石頭:http://rockchao.blog.51cto.com/133022/38849


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM