日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在研究基于TCP的通信協議。我所知

有很多方法可以確定何時結束閱讀。

在消息末尾關閉連接

將消息的長度放在數據本身之前

使用分隔符;一些在正常數據中永遠不會出現的值(或者總會以某種方式轉義)

通常,我嘗試通過WiFi網絡發送文件(可能不穩定且速度較慢)

RSA和AES通信的原因我不想每次都關閉連接(不能使用1)

這是一個很大的文件,我無法預測它的長度,因此我無法采取行動

作為方法(不能使用2)

讀取時檢查特殊內容,寫入時進行轉義需要很多過程(不能使用3)

此方法應與c#和java兼容。

你有什么建議?

更一般的問題:

How to identify end of InputStream in java

C# - TcpClient - Detecting end of stream?

更多信息

我正在編碼TCP客戶端服務器通信

首先,服務器生成RSA公共代碼并將其發送到客戶端。

然后,客戶端將生成AES(key,IV)并使用RSA加密將其發送回去。

直到這里一切都很好。

但我想通過該網絡發送文件。這是我當前的數據包EncryptUsingAES(新AES.IV(16字節)+ file.content(任何大小))

在服務器中,我無法捕獲客戶端發送的所有數據。所以我需要知道要讀取多少數據(TcpClient.GetStream()。read(buffer,0,buffersize))

當前代碼:

List message = new List();

int bytes = -1;

do

{

byte[] buffer = new byte[bufferrSize];

bytes = stream.Read(buffer, 0, bufferrSize);

if (bytes > 0)

{

byte[] tmp = new byte[bytes];

Array.Copy(buffer, tmp, bytes);

message.AddRange(tmp);

}

} while (bytes == bufferrSize);

參考方案

您的第二種方法是最好的方法。給每個數據包加上前綴長度將創建一個可靠的消息幀協議,如果正確完成,它將確保即使以與發送數據包相同的大小也能接收到所有數據(也就是說,沒有部分數據或數據被集中在一起)。

推薦的報文結構:

[Data length (4 bytes)][Header (1 byte)][Data (?? bytes)]

-所討論的標頭是一個字節,您可以使用它指示這是哪種數據包,以便端點知道如何處理它。

發送文件

文件發件人在90%的情況下都知道要發送的數據量(畢竟,它通常將文件存儲在本地),這意味著知道文件中有多少文件沒有問題是否發送。

我使用并推薦的方法是從發送“信息包”開始,該信息包向端點說明它將要接收文件以及該文件包含多少字節。之后,您開始發送實際數據-最好是分塊發送,因為一次處理整個文件效率不高(至少是大文件時如此)。

始終跟蹤您到目前為止已收到文件的多少字節。這樣,接收者可以自動知道何時接收到整個文件。

一次發送幾個千字節的文件(我使用8192字節= 8 kB作為文件緩沖區)。這樣,您不必將整個文件讀入內存,也不必同時加密所有文件。

加密數據

處理加密將不會有問題。如果使用長度前綴,則只需對數據本身進行加密,并保持數據長度頭不變。然后必須通過加密數據的大小來生成數據長度標頭,如下所示:

加密數據。

獲取加密數據的長度。

產生以下數據包:

[Encrypted data length][Encrypted data]

(如果需要,在其中插入標頭字節)

接收加密文件

實際上,接收加密文件并知道何時接收到所有內容并不是很困難。假設您使用上述發送文件的方法,則只需執行以下操作:

接收加密的數據包→將其解密。

獲取解密數據的長度。

增加一個變量,以跟蹤接收到的文件字節數。

如果收到的金額等于預期的金額:關閉文件。

其他資源/參考

您可以參考我以前寫的關于TCP長度前綴消息幀的兩個答案:

C# Deserializing a struct after receiving it through TCP

TCP Client to Server communication

JAVA 8具有任何匹配屬性的對象的過濾器列表 - java

我的要求是通過匹配任何屬性的字符串來過濾對象列表。例如,假設Contact類具有三個屬性:街道,城市,電話。我知道java流過濾器是如何工作的,在這里我必須將輸入字符串與每個屬性進行比較,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…檢查Optional中是否存在null屬性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional persons) { return persons .map(p…Java:線程池如何將線程映射到可運行對象 - java

試圖繞過Java并發問題,并且很難理解線程池,線程以及它們正在執行的可運行“任務”之間的關系。如果我創建一個有10個線程的線程池,那么我是否必須將相同的任務傳遞給池中的每個線程,或者池化的線程實際上只是與任務無關的“工人無人機”可用于執行任何任務?無論哪種方式,Executor / ExecutorService如何將正確的任務分配給正確的線程? 參考方案 …JAVA:字節碼和二進制有什么區別? - java

java字節代碼(已編譯的語言,也稱為目標代碼)與機器代碼(當前計算機的本機代碼)之間有什么區別?我讀過一些書,他們將字節碼稱為二進制指令,但我不知道為什么。 參考方案 字節碼是獨立于平臺的,在Windows中運行的編譯器編譯的字節碼仍將在linux / unix / mac中運行。機器代碼是特定于平臺的,如果在Windows x86中編譯,則它將僅在Win…java:繼承 - java

有哪些替代繼承的方法? java大神給出的解決方案 有效的Java:偏重于繼承而不是繼承。 (這實際上也來自“四人幫”)。他提出的理由是,如果擴展類未明確設計為繼承,則繼承會引起很多不正常的副作用。例如,對super.someMethod()的任何調用都可以引導您通過未知代碼的意外路徑。取而代之的是,持有對本來應該擴展的類的引用,然后委托給它。這是與Eric…

總結

以上是生活随笔為你收集整理的java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。