我知道这肯定是一个非常普遍的问题,但是我还没有找到关于如何做到的明确答案。
首先,假设我们有一个接受以下查询的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服务器,这可能吗?如果有人可以给我指出一个好的例子或一些示例代码,那将不胜感激。我搜索了很多网站,但都无济于事。
最佳答案
在这里,我放置了一个简单的代码来连接到服务器。如果这是您的问题,可能会对您有所帮助。
void client(const char* server_address, short server_port)
{
int sockfd;
struct sockaddr_in servaddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(server_port);
inet_pton(AF_INET, server_address, &servaddr.sin_addr);
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
//from this point you can start write to the server and wait for its respose
std::string buffer = "testquery";
writen(sockfd, buffer.c_str(), buffer.length());
char *ReadBuffer[512];
while(1)
{
memset(ReadBuffer, 0x00, sizeof(ReadBuffer));
int n = readn(sockfd, ReadBuffer, sizeof(ReadBuffer));
if(n <= 0)
{
//or you dont have anything to read, or you have a problem
break;
}
//this function does the hard job of knowing what to do with all these data
processBuffer(ReadBuffer, n);
}
close(sockfd);
}
我使用的是Posix标准,代码非常简化,但我认为这是一个起点。
问候。