2012-05-16 77 views
1

Java客戶端可以使用TCP連接到C++服務器。 Java客戶端在Win7上。 C++服務器在Linux上。如何將數據從Java客戶端發送到C++服務器?

問題是我無法成功發送數據到C++服務器。 Java代碼是:你的善良幫助

public static void main (String [] args) throws IOException { 
    Socket sock = new Socket("10.217.140.200",7000); 

    String id = "TEST"; 
    char encoding = 'a'; 

    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); 
    oos.flush(); 

    oos.writeObject(encoding); 

後,我現在用的OutputStream和它的作品。請記住刪除ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());,否則它會向C++服務器輸出4個字符。

+0

您確實沒有提供足夠的信息來確定問題出在哪裏,但是一開始'oos.flush()'應該放在'oos.writeObject()'之後,而不是之前。 – Mac

+0

謝謝,我現在將.flush()移動到末尾 – zhoubo

+0

,我可以將數據從java客戶端發送到C++服務器,奇怪的是數據從第四個位置開始存儲(不知道爲什麼0到3的位置是不曾用過 )。 當我在C++端打印接收到的數據時,打印0到3的結果是兩個? 任何人都知道前四個位置用於什麼? – zhoubo

回答

2

您正在使用ObjectOutputStream,其確實是Java object serialisation。這不是(容易)跨語言移植的。由於您只發送字符串,因此不需要使用ObjectOutputStream - 只需使用從套接字返回的OutputStream即可。

+0

謝謝,我更改爲outputstream,現在,我可以將數據從java客戶端發送到c + +服務器,奇怪的是,存儲的數據從第四個位置開始(不知道爲什麼是0到3位置不使用)。當我在C++端打印接收到的數據時,打印0到3的結果是兩個?任何人都知道前四個位置用於什麼? – zhoubo

+0

請用您的更新代碼編輯您的原始問題 –

0

我強烈建議使用一些第三方庫來對對象進行序列化。手動操作非常耗時(對你而言)並且容易出錯。

我個人很喜歡Google Protocol Buffers。我在幾乎所有的項目(Java服務器,.Net客戶端,C++客戶端)上積極使用它。

這是什麼? 協議緩衝區是以高效但可擴展的格式對結構化數據進行編碼的一種方式。谷歌幾乎所有的內部RPC協議和文件格式都使用Protocol Buffers。

不同語言的實現列表是here

0

你也可以在你的C++端使用JNI來處理反序列化的東西。

您不能使用C++直接反序列化Java對象。

0

將代碼更新爲不使用ObjectOutputStream後,我會猜測您的問題是在C++服務器中,還是因爲在通過套接字傳輸之前沒有將字符串轉換爲ASCII。 Java字符串可以用各種編碼表示,包括Unicode。

這樣對你有好處嗎?

public static void main (String [] args) throws IOException 
{ 
    Socket sock = new Socket("10.217.140.200",7000); 
    String id = "TEST"; 

    OutputStream oos = sock.getOutputStream(); 

    oos.write(id.getBytes("US-ASCII")); 
    oos.flush(); 
} 

如果不是,請通過編輯您的問題發佈您更新的客戶端和服務器端代碼。

+0

儘管我同意您應該明確設置要使用的編碼,但考慮到測試字符串僅僅是「測試」,並且這將映射到幾乎任何編碼方案的正確位置,不要以爲這會成爲問題。 (我所說的是,平臺的默認編碼方案很可能在「底部」有ASCII字符集,因此「測試」應該可以工作)。 –

+0

是的,實際上沒有必要在裏面添加「US-ASCII」,它仍然可以正常工作 – zhoubo

相關問題