1. 程式人生 > >lidgren 介紹和使用 (四)------ p2p

lidgren 介紹和使用 (四)------ p2p

p2p前幾年比較流行,因為他不需要伺服器,通過不同客戶端內網,就可以互動。

他的原理也很簡單,就是先內網傳送給伺服器,瞭解到自己的外網ip和埠。然後內網向對方外網傳送資料。

由於nat,也就是路由器的阻攔,第一次傳送資料會被拋棄,但傳送方的 路由器卻記錄了 對方的ip,這樣對方 傳送外網 給你,就不會被 nat路由器阻攔,當然,nat開放通道的時間很短,1--2秒,所以兩臺客戶端要同時多次傳送,確保成功。我做了一個小demo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace udp_Client_demo { public partial class Form1 : Form { private static IPEndPoint epServer;
private static UdpClient local; private int port; public Form1() { InitializeComponent(); epServer = new IPEndPoint(IPAddress.Parse("103.200.30.194"), 11000); local = new UdpClient(9001); //繫結本機IP和埠,9001 } private void conn_Click(object
sender, EventArgs e) { string strSend = "wwww"; byte[] sendData = Encoding.ASCII.GetBytes(strSend); //開始非同步傳送,啟動一個執行緒,該執行緒啟動函式是:SendCallback,該函式中結束掛起的非同步傳送 local.BeginSend(sendData, sendData.Length, epServer, new AsyncCallback(SendCallback), null); //開始非同步接收啟動一個執行緒,該執行緒啟動函式是:ReceiveCallback,該函式中結束掛起的非同步接收 local.BeginReceive(new AsyncCallback(ReceiveCallback), null); mes.Text += ss; } private void SendCallback(IAsyncResult iar) { int sendCount = local.EndSend(iar); if (sendCount == 0) { Console.WriteLine("Send a message failure..."); } } private string ss; private void ReceiveCallback(IAsyncResult iar) { byte[] receiveData = local.EndReceive(iar, ref epServer); ss = Encoding.ASCII.GetString(receiveData); } private void button1_Click(object sender, EventArgs e) { Int32.TryParse(ports.Text, out port); //設定伺服器端IP和埠 epServer = new IPEndPoint(IPAddress.Parse(horts.Text), port); } private void button2_Click(object sender, EventArgs e) { string strSend = mes.Text; byte[] sendData = Encoding.ASCII.GetBytes(strSend); //開始非同步傳送,啟動一個執行緒,該執行緒啟動函式是:SendCallback,該函式中結束掛起的非同步傳送 local.BeginSend(sendData, sendData.Length, epServer, new AsyncCallback(SendCallback), null); //開始非同步接收啟動一個執行緒,該執行緒啟動函式是:ReceiveCallback,該函式中結束掛起的非同步接收 local.BeginReceive(new AsyncCallback(ReceiveCallback), null); } } }

用winform 寫的,原理很簡單,先點選連線伺服器,在伺服器裡面看到自己和對方的 外網ip,然後填寫對方ip,然後點選連線客戶端,這個時候,點擊發送客戶端,對方就能獲得資料。

不過有一點必須注意!!!

同nat,也就是 2臺客戶端 都在一個 路由器下,不能被接收,想想也是,一個路由,他能自己給自己開通道嗎,另外手機 4g包括熱點,不能,因為 4g網路的 路由 是 對稱 型的,就是埠 改變的,所以測試時候,條件還是

很苛刻的,我家樓下正好有 小店,無線路由器能 照到我家,配合我家的路由,才能測試。

 

 

 

好了,說道這裡,有人要說,如今都是手機上網,那麼 如何 點對點 通訊呢?

答案就是 upnp!!! 下一篇,最終篇《upnp  通訊》,大家期待。