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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园螃蟹在哪里钓?
- 下一篇: java的datatype_java数据