使用ConsoleApplication (MS-DOS)
client端
需引用:
using System.Text;
using System.Net;
using System.Net.Sockets;
完整程式碼:
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("172.11.11.11"), 5555); //定義一個位址 (伺服器位址)
Socket Client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //傳輸模式為UDP
while (true) //持續給使用者輸入訊息以及持續監聽,接收伺服器回傳訊息
{
string input = Console.ReadLine(); //可以輸入訊息
Client.SendTo(Encoding.UTF8.GetBytes(input), remoteIP); //(寄什麼訊息,對象的IP位址)寄出前先編碼成byte資料格式
byte[] data = new byte[4096]; //存放接收的資料
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定一個空端點(唯讀)
EndPoint Remote = (EndPoint)sender; //不會解釋.. 宣告可以存放IP位址的用 EndPoint
int recv = Client.ReceiveFrom(data, ref Remote); //(收到的資料,來自哪個IP放進Remote) 不能放IPEndPoint 好像是它唯獨的關係 這時候sender已經變成跟remoteIP一樣
Console.WriteLine("伺服器來自 " + "[" + Remote.ToString() + "] : " + Encoding.UTF8.GetString(data, 0, recv)); //顯示資料前也要編碼一次 轉換回string資料格式
}
自己的理解:
端點IPEndPoint , IP可以看成是一個大樓地址 , port可以當作這大樓地址哪個門或哪個窗口
所以client端要先定義要寄信去的大樓地址 , 也就是伺服端位址("172.11.11.11") , 以及從哪個窗口進去(5555)
有時伺服器回傳大量資料 , 有可能會收不到或接收不完全 , 我把存放接收資料的空間 byte[1024] 改大 , 之後就沒發生這問題了 (不知是不是這樣 有可能巧合)
socket UDP 接收資料時會block(阻塞模式)住直到收到資料為止 , 沒收到資料就可能畫面整個停住不動
(這裡的不會)如果是寫在按鈕裡例如unity或windows from 就可能會
可以加下面這行:
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100); //設定的時間內解除阻塞模式
Server端
需引用:
using System.Text;
using System.Net.Sockets;
using System.Net;
完整程式碼
IPEndPoint IPEnd = new IPEndPoint(IPAddress.Any, 5555); //定義好伺服器port
Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //傳輸模式為UDP
Server.Bind(IPEnd); //綁定ip和port
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定義空位址 給接收的存放(唯讀)
EndPoint Remote = (EndPoint)sender; //宣告可以存放IP位址的用 EndPoint
byte[] getdata = new byte[1024]; //要接收的封包大小
while (true)
{
int recv = Server.ReceiveFrom(getdata, ref Remote); //把接收的封包放進getdata且傳回大小存入recv , ReceiveFrom(收到的資料,來自哪個IP放進Remote) 不能放IPEndPoint 因為唯獨
string input = Encoding.UTF8.GetString(getdata, 0, recv); //把接收的byte資料轉回string型態
Console.WriteLine("客戶來自 " + "[" + Remote.ToString() + "] : " + input); //將收到的顯示
Server.SendTo(getdata, recv, SocketFlags.None, Remote); //將原資料送回去
}
自己的理解:
一樣先定義一個位址 , 但這個位址不知道是誰的 , 沒有主人 , 所以要Bind , Bind時會自動讀出這台電腦的IP , 重點是port(5555)是自訂的 ,
Bind之後表示這個伺服器(這棟大樓)的窗口是(5555) , 這樣client端才能根據伺服器IP("172.11.11.11"),5555這通道寄訊息過來
主要功能都在這寫 , 例如當收到特定的值時伺服器回特定的資訊 ex:收到1給1的資訊 , 收到2給2的資訊
這邊程式是設定將原資料送回去
初學 , 不知道有沒有講錯>< :O