2012-11-15 33 views
1

目前我正在開發一個Java客戶端,它將二進制數據命令發送到設備面板。我有一個奇怪的問題,如果我每個套接字連接發送一個命令(一個TCP會話),所有命令都可以正常工作。但是,當我在一個連接(相同的TCP會話)中發送多個命令時,第一個命令在設備面板上完全執行,但在第二個命令中,它獲得了兩個額外的字節值0x010x00。這很奇怪,我過去幾天一直在嘗試,但找不到答案。Java Socket客戶端向設備發送額外的字節

我的代碼:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
sslsocket = (SSLSocket) sslsocketfactory.createSocket(deviceIP, port); 
//Output Streams 
OutputStream outputStream = sslsocket.getOutputStream(); 

outputStream.write(command1); 

outputStream.write(command2); 

注意command1command2是字節數組:

  • 價值命令1 = 01,01,01
  • 價值命令2 = 01,34,45 ,34,56

設備面板的日誌是:

Received command: 01 01 01 
Received command: 01 00 01 03 45 34 56 

可能是什麼問題?您的建議將受到高度讚賞。

+0

你可以使用純TCP(無SSL)進行測試嗎?然後你可以檢查tcpdump並找出命令是否正確發送。也許這是失敗的接受方。 – Kylo

+0

沒有我不能,因爲設備只有在設備上打開SSL基本端口,我已經檢查了字節的內容之前寫在流看起來完美,但是當我檢查設備的日誌有兩個字節出現在日誌中。 – zaffargachal

+0

該設備如何知道發送的命令的長度?也許你錯過了協議中的東西?這總是01 00是添加?你有沒有嘗試改變這個第一個命令?然後會發生什麼? – Kylo

回答

1

我與SSLSocket的Java 6應用程序有同樣的問題,服務器在兩次寫入之間收到額外的字節。 額外的字節是您的SSL連接的CBC保護。 如果您不想要額外的字節,請添加java屬性-Djsse.enableCBCProtection = false以禁用CBC保護。

+0

應用程序永遠不會看到額外的SSL字節。 – EJP

1

Java和您的操作系統不會添加額外的字節。否則,一半的互聯網將無法工作。很顯然,設備出現故障或者您錯誤地觀察它。

+0

那麼當我用chilkat庫實現來替換java套接字時,我的程序工作正常,但只是改變了從chilkat套接字到java套接字的改變,使我的程序表現得像這樣。 – zaffargachal

+0

@zaffargachal當你用工作代碼替換錯誤代碼時,你的程序工作正常。奇怪。 – EJP

相關問題