我知道這肯定是一個很常見的問題,但我一直無法找到關於如何做的明確答案。Java套接字(服務器)和C++套接字(客戶端)之間的網絡通信
首先,假設我們有一個接受查詢,如Java服務器(我只是把相關的行,我已經取出來了異常處理的清晰度):
ServerSocket socket = new ServerSocket(port);
while (true) {
ClientWorker w;
w = new ClientWorker(socket.accept());
Thread t = new Thread(w);
t.start();
}
,然後在在ClientWorker
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(client.getOutputStream());
String query = inFromClient.readLine();
// process query here
String response = "testresponse";
outToClient.writeBytes(response + "\n");
outToClient.close();
inFromClient.close();
client.close();
現在,我可以得到一個Java客戶端與此服務器的工作原理:
String query = "testquery";
Socket queryProcessorSocket = new Socket(queryIp,queryPort);
DataOutputStream queryProcessorDos = new DataOutputStream(queryProcessorSocket.getOutputStream());
BufferedReader queryProcessorReader = new BufferedReader(new InputStreamReader(queryProcessorSocket.getInputStream()));
queryProcessorDos.writeBytes(query + "\n");
String response = queryProcessorReader.readLine();
但是我怎樣才能得到一個C++客戶端來做和java客戶端一樣的事情呢?我嘗試了很多東西,但似乎沒有任何工作。理想情況下,我不想觸摸java服務器,這是可能的嗎?如果有人能指出我一個很好的例子或一些示例代碼,那將非常感激。我搜索了很多網站,但無濟於事。
很好的例子,雖然你應該記得檢查返回代碼,特別是檢查錯誤代碼。如果發生錯誤,您的循環將結束,並且您不檢查以確保連接成功。在網絡代碼中,絕對有必要知道您的緩衝區中實際上還有多少數據,並且不要以爲這些數據是以null結尾的。另外,多個調用在一端發送可能會導致這些緩衝區被連接起來,這樣您就可以在另一端讀取所有數據。 – 2009-12-22 00:48:25
輕微nitpicky點:有點奇怪,你繼續寫512而不是sizeof(ReadBuffer)。另外,如果read()獲取EINTR? – asveikau 2009-12-22 00:48:45
@Jeff:實際上,通過閱讀代碼示例,我假定processBuffer()將處理錯誤,並可能將任何部分完成的請求分割爲多個讀取到單獨的堆緩衝區,以便在下次讀取時處理。至少,這就是我要做的。 – asveikau 2009-12-22 00:52:47