Unity Socket網路處理

2021-10-04 19:05:36 字數 1826 閱讀 5557

先宣告用於網路練接的socket,以及用於接收網路資料的快取區

//用於網路連線的socket

private socket _socket;

//緩衝區大小

private const int buffsize = 1024*1024;

//使用者存放接收到的網路資料

private readonly byte packbuffer = new byte[buffsize];

連線方法。

iport 是伺服器的ip與埠

/// /// 連線

///

public void connection(ipendpoint iport)

catch (exception e)

finally

}

接收網路資料,如果接收到網路資料將會自動呼叫 onreceived方法。

onrecived方法不是主線程執行,而是子執行緒執行的,所以要注意變數的使用

/// /// 接收到資料

///

///

public void onreceived(iasyncresult ia)

//packstrbuffer 是接收緩衝區stringbuilder物件。

//把接收到的資料拷貝到 packstrbuffer 中等待處理

string message = packstrbuffer.tostring();

//注意一次onrecived的呼叫並不意味著接收到乙個網路資料報。

//1.可能是兩個網路資料報 粘包現象

//2.可能是乙個完整的包

//3.可能是乙個包的一部分。

//一般來說會在每個包的前面描述出包的資料大小,用於分割包裹。

//此處我用換行符來分割每乙個包 newline = ' \r\n'; 如果你跟我一樣設計的話,那麼資料報中不能出現換行符,否則將會導致包解析錯誤。

//找到換行符位置

int pidx = message.indexof(newline);

while (pidx >= 0) //有換行符,表明接收到乙個完整的包

//包資料處理完成後,繼續去接收資料

_socket.beginreceive(packbuffer, 0, buffsize, socketflags.none, onreceived, _socket);

}catch (exception e)

finally

}

主動斷開連線

public void disconnect()
傳送資料

////// 發包

///

///

private void sendpack(string message)

catch (exception e)

}

以上是unity socket tcp 網路鏈結的簡單實現。

應用在遊戲中還需要考慮到

1.自動重連的問題。

2.網路中斷檢測問題,遊戲時候客戶端網路中斷,服務端是無法知道客戶端的斷開。所以會加入心跳包的設計,客戶端每隔一段時間就向伺服器傳送乙個心跳包,伺服器如果有一段時間未接收到客戶端傳送過來的心跳包,則認為客戶端連線中斷。關閉與客戶端的連線。

3.資料量的問題,此處base64的設計並不好,因為進行base64編碼後,資料量會增大,並且多一層轉換,效率也有所損耗。在進行收發時,一般需要對傳送的資料進行壓縮處理,接收到資料報後再進行解壓處理,這樣可以減少伺服器頻寬,提公升網路傳輸速率。

網路心跳包處理

以前在學習socket程式設計時都只是簡單的呼叫微軟的api函式,很少考慮網路的異常處理。在做實際的專案中網路異常是必須要考慮到的。網路斷開掉線異常處理 heartbeat 網路心跳包 一下是個人理解,網路心跳包的處理方式有兩種 方式一 終端主動發起,伺服器記錄各個終端最後乙個包的時間點,然後定時掃...

網路處理器

網路處理器特定的應用於通訊領域的各種任務,比如包處理 協議分析 路由查詢 聲音 資料的匯聚 防火牆 qos等。網路裝置如路由器和交換機的體系結構的發展基本上經歷了基於通用處理器的體系結構和基於 asic risc 的體系結構兩個階段。基於網路處理器的體系結構是在以上兩種體系結構的基礎上,綜合了雙方優...

ios網路資料處理

ios之同步請求 非同步請求 get請求 post請求 1 同步請求可以從網際網路請求資料,一旦傳送同步請求,程式將停止使用者互動,直至伺服器返回資料完成,才可以進行下一步操作,2 非同步請求不會阻塞主線程,而會建立乙個新的執行緒來操作,使用者發出非同步請求後,依然可以對ui進行操作,程式可以繼續執...