2013-05-27 143 views
0

我試圖找到一種可靠的方式來發送控制消息,服從一個定義的協議,以告訴服務器他將收到什麼樣的數據。例如,我想送一個純文本消息調用一個遠程方法:簡單的Java TCP套接字協議

#METHOD1#CLOSE# 

或我想序列化對象發送到服務器:

#OBJECT# .......here comes the serialized object data....#CLOSE# 

所以基本上我只是想送字符串控制消息,它們完全獨立於後面的流內容 。

通過將輸入流包裝到Scanner對象中,我可以從輸入流中提取字符串,但是如果此流是序列化對象,則以後無法恢復該對象。謝謝你的幫助。

+1

爲什麼不使用衆多現有協議之一來達到此目的?例如,JSON-RPC?你有什麼具體要求? – fge

+0

如果可能,它應該是一個純粹的基於套接字的解決方案。我只是想知道如何做到這一點。如果可能,「 – user1812379

+1

」是無效的原因。這就是爲什麼我問你的要求。如果現有的協議已經滿足您的需要,那麼根本沒有理由破解您自己的協議。不要重新發明輪子! – fge

回答

1

您可以使用像Base64這樣的方案(例如,使用Apache的庫)將Object從字節編碼爲字符串,然後返回。

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
new ObjectOutputStream(baos).writeObject(object); 
String serializedObject = Base64.encode(baos.toByteArray()); 

byte[] bytes = Base64.decode(serializedObject); 
ByteArrayInputStream baos = new ByteArrayInputStream(bytes); 
Object object = new ObjectInputStream(baos).readObject() 
+0

Java的BASE64編碼器/解碼器怎麼樣?所以,基本上我必須將對象編碼爲一個字符串,然後將該對象字符串附加到控制消息字符串,對吧?爲了解碼消息,我讀取了表示控制消息的字符,如果消息說它是一個對象,我繼續解碼字符串的其餘部分到一個對象。 – user1812379

+0

是的,沒錯。您可以使用任何您喜歡的Base64編碼器/解碼器。 –