天天看點

Amf3+socket開發網絡遊戲或應用的一點研究心得

原文位址:

http://bbs.9ria.com/forum.php?mod=viewthread&tid=88720&highlight=Amf3%2Bsocket

這幾天都在擺弄socket,一研究才發現這潭水深啊,這裡就簡略的說一下開發時的要點和心得。

資料類型:

as3+socket,一搜網上一大堆,但是大多是基于字元串的傳遞,就是發送和接收都是字元串,每個消息用換行來區分,這不是坑爹麼!如果我要發送布爾,數組,帶換行的字元串咋辦?如果用其他的字元來代替換行符然後再轉換處理也太傻了點吧。是以就好的辦法就是使用二進制資料來處理,as3發送二進制資料應該沒有什麼太大的問題,socket的方法裡的writeXXX全是寫成二進制的資料,主要是服務端的處理也要用二進制才行。

然後是使用AMF3的格式來發送,socket的writeObject就是把一個對象序列化為一個AMF3或者AMF0格式的二進制資料的,服務端需要搭配第三方類庫來解碼為可用的資料。AMF3的使用可以看這裡,JAVA為背景的:http://blog.sina.com.cn/s/blog_6bc2090c0100ru9w.html

粘包和斷包:

TCP中沒有包的概念,隻有流的概念。所有的資料都是接收到緩沖區一滿就發送,比如我們發送了多個資料,最後可能會一次性都發送出去,這時候再處理就沒辦法區分,這樣叫做粘包。還有斷包,由于資料太大或者網絡太慢,一條資料被發送了多次,這樣叫做斷包,處理方法,手動加入一個標頭來區分每個包,可以參考下面的文章:http://cjmxp007.blog.163.com/blog/static/35473837201061054116916/

服務端的阻塞和非阻塞:

阻塞就是使用多線程,一個用戶端對應一個線程,這樣容易引起一些問題,主要是資源浪費和一些并發問題。而非阻塞則是用一個線程來處理所有的問題,可以節省資源和避免并發問題。不同的背景語言的實作方法就自己去找了,我這裡搜到非阻塞的一些介紹,JAVA的:http://www.doc88.com/p-67443613181.html

as3的socket安全政策問題:

每次用我們的自定義的socket連接配接之前swf都會先用一個特殊的socket先進行連接配接,該socket用來申請安全政策,會發送字元串"<policy-file-request/>\0"然後等待我們傳回安全政策的字元串回去,如果安全政策允許連接配接則斷開這個特殊的socket連接配接再用我們的socket去連接配接,否則就不會連接配接,這裡有很多的說明:http://hi.baidu.com/mr_ziqiang/blog/item/7a2c4baf2c4a21fdfbed501e.html

斷網問題:

這個是我最怕的,弄到現在都沒弄好,就一個解決問題的思想,以後有時間再弄了,這裡就說說我的解決方法吧。

首先說說關閉和斷網不一樣,關閉是用戶端調用close方法,服務端會接收到一個空消息;或者服務端關閉一個用戶端,用戶端會觸發Event.CLOSE事件。好了,如果斷網的話,用戶端不會有任何的事件和異常,服務端就更傻了,還可以給這個用戶端發送消息,沒有任何異常,當然了,兩個都是發得出去但是啥也收不到,咋辦呢,這裡發現一篇文章:http://liu-ms.iteye.com/blog/935051

就用這個方法來處理,用戶端和服務端都弄一個逾時的計時器,每次發送消息都要對方在接收到消息後傳回一個特殊消息,如果超過一定時限還沒有接收到對應的消息則視為斷網這種情況,然後就用方法close關閉掉,再在一定時間後重新連接配接既可。

資料壓縮(優化傳輸速度):

呵呵,這個是最輕松的一個了,flash用的是ZLib壓縮算法,一個壓了再發送給另一個,接收到再解壓既可,注意兩點:1.我發現如果資料在150個位元組以下時壓縮後會變大,資料越大壓縮效果越明顯。2.標頭資訊不要壓縮,那個標頭是用來解決粘包和斷包問題的,壓了可不得了。

as3