2011-12-05 15 views
1

這裏有一點問題。AS3服務器套接字,進度事件,readutfbytes

我工作的多人遊戲與Flash,並使用python對事物的服務器端。我有套接字連接工作... sorta,和相當多的python工作,但我遇到了一個奇怪的問題。

比方說,在登錄,我發送一些數據包含他們的一些信息的客戶端。 之後,我發送一些數據將它們分配到一個房間。

似乎這個數據在AS3中不應該被理解成兩個不同的東西,相反,readUTFBytes後,它是所有在相同的字符串。

var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable); 

在蟒蛇,我已經定義的方法來發送數據,這只是通過transport.write(雙絞線)發送數據,而我通過在動作腳本進度插座數據事件receieving。任何想法在這裏可能是錯的?這裏有一些代碼...

if (! event.currentTarget.bytesAvailable > 0) { 
      return; 
     } 
     var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable); 
     var Char1:String = str.charAt(0); 
     var Char2:String = str.charAt(1); 
     str = str.replace(Char1, ""); 
     str = str.replace(Char2, ""); 

     // Various messages 
     if (Char1 == "\x03") { 
      if (Char2 == "\x03") { 
       trace("Got ping thread"); 
      } 
      else { 
       trace("x03 but no secondary prefix handled"); 
      } 
      return;    
     } 

很潦草我知道,但我試圖只是確定一個問題。

的所有數據都帶有兩個前綴,像\ X02和\ x09表示我決定做什麼,然後在字符串中的大部分數據被分割在\ X01得到的值。

問題本質上是,我應該得到一個/ x08/x08數據,我得到/ x08/x08 data/x05/x03數據,當它應該是兩個單獨的東西。

回答

2

TCP連接是可靠的,有序的,面向流的傳輸。流是沒有固有消息邊界的字節序列。如果你想你的字節分成單獨的郵件中,字節本身必須告訴你如何做到這一點拆分(或你需要始終適用,如「消息是5個字節長」一些外部規則)。

這適用於所有的TCP連接,無論您使用哪種語言,或者使用什麼奇怪的特定於庫的API(比如readUTFBytes)。

協議有很多選擇哪些可以幫助您框架您的消息。例如,你可以使用長度前綴。然後,你的消息將是這樣的:

\x07 \x08 \x08 h e l l o \x05 \x05 \x03 m a n 

\x07給人的第一條消息,7個字節的長度:\x08 \x 08 h e l l o。該消息後的下一個字節\x05給出了第二條消息的長度:\x05 \x03 m a n

如果消息需要更長,或者使用十進制表示和分隔符來支持任意大小的前綴,則可以使用多字節長度前綴。還有更復雜的協議提供更多的功能,而不僅僅是將您的字節分隔成消息。例如,有AMP它給你一個帶有參數和響應的RPC形式。

+0

謝謝,這清理了很多。有人還建議使用終止符,但我想我想先學習更復雜的方法。再次感謝! – WeaponsTheyFear

+1

很高興幫助。由於您發現答案有用,因此您可能需要單擊複選標記以接受答案。 :) –

+0

+1用於消息長度的前綴,並在as3端執行自己的分割。 as3插座不是很好 – divillysausages