我知道这肯定是一个很常见的问题,但我一直无法找到关于如何做的明确答案。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