2011-02-24 61 views
0

我想通過套接字與我的PC上的本地AS3 Air應用程序進行通信。 在這種情況下,VB.Net應用程序充當服務器,而Air應用程序是客戶端。VB.Net套接字通信,正在接收異常數據

.Net應用程序每25ms向Air應用程序發送數據。我沒有發送任何消息終止。 我剛收到有關Air應用程序的數據並對其進行處理。

在接收端,當我調試數據時,我看到一些轉換已經被連接。

喜歡的東西,如果我送"ABCDEF"先後爲大多數情況下,我在某些情況下,我收到"ABCDEF"但是我收到"ABCDEFABCDEF"

有沒有可能是底層TCP網絡相結合的數據,然後發送它作爲一個包。 我是否真的需要發送一些消息終止符,例如"ABCDEF$",然後在接收端拆分我的消息?

我是不是玩得很開心?

回答

1

從文檔Socket.Send

也沒有保證你發送的數據會立即出現在網絡上。爲了提高網絡效率,底層系統可能會延遲傳輸,直到收集大量傳出數據爲止。發送方法的成功完成意味着底層系統有足夠的空間來緩存網絡發送的數據。


還有不能保證你會在接收端收到完整的消息要麼 - 這是插座多麼工作。我建議添加一個「消息結束」標記,並循環接收代碼,直到您收到完整的消息 - 但是您可能會收到一個跨越兩條消息的緩衝區,因此當您收到「消息結束」標記時,您需要保留在該點之後收到的任何數據,以用於重構下一條消息。

I.e.想象你有兩條消息要接收 - 「AAAAAA」和「BBBBBBBB」。您可能會收到來自三個不同的電話產生以下(後增加爲$消息標記的結束)接收:

AAAA 
AAAA$BB 
BBBBBB$ 
+0

我正在使用networkStream.Write(),這也適用於該方法嗎? – 2011-02-24 12:51:50

+0

@Kevin - 是的,它使用'Socket。發送'內部 – 2011-02-24 13:08:56

+0

什麼是避免這種情況的推薦技術? – 2011-02-24 14:10:14

1

你可以設置NoDelay爲True插座上?

Nagle算法旨在通過使套接字緩衝小數據包,然後在某些情況下組合並將它們發送到一個數據包中來減少網絡通信量。一個TCP數據包由40個字節的頭部和正在發送的數據組成。當小數據包與TCP一起發送時,由TCP報頭產生的開銷可能成爲網絡流量的重要組成部分。在負載較重的網絡上,由此開銷導致的擁塞可能導致數據報和重傳丟失,以及擁塞造成的傳播時間過長。當新的傳出數據從用戶到達時,如果連接上的任何先前傳輸的數據仍未被確認,則Nagle算法禁止發送新的TCP段。

+0

我和我必須在客戶端(空氣應用程序)和服務器(.net)上設置它嗎? – 2011-02-24 16:05:12

+0

我相信這是爲了發送數據包,所以只有服務器應該需要它設置。 – 2011-02-24 16:10:56

+0

我在客戶端連接時將服務器端的NoDelay設置爲true,但仍然收到約1000條發送的郵件中約有20條郵件。 – 2011-02-24 17:24:10