我知道这一定是一个非常常见的问题,但我无法就如何做到这一点找到明确的答案。
首先,假设我们有一个接受查询的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服务器,这可能吗?如果有人可以给我一个很好的例子或一些示例代码,那将非常感激。我在很多网站上搜索过但无济于事。
答案 0 :(得分:5)
这里我放了一个简单的代码来连接服务器。如果这是你的问题,它可能会有所帮助。
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标准,代码非常简化,但我认为它是一个起点。
问候。
答案 1 :(得分:2)
你是怎么说“它不起作用”?
如果不仔细研究代码,我首先关心的是你将String(字符或字节对)转换为字节,然后将它们发送到套接字。您是否在C ++端以相同的方式检索这些?即使用相同的字符编码?
答案 2 :(得分:1)
只要您不使用特定于语言的协议(例如Java RMI)并使用直接套接字(或其他一些语言中立协议,如Web服务),它就可以工作。您只需要确保您的客户端和服务器使用相同的协议(例如,TCP / IP +您的自定义协议)。如果使用直插座,你基本上是通过线路发送二进制 - 所以你需要确保你在两侧编码/解码数据相同。通常,这是通过某种字节级协议完成的,如果你自己滚动的话。例如,Project Dark Star是一个用Java编写的游戏服务器,但它有Java,C / C ++,Flash等客户端。它使用用户定义的二进制协议进行跨语言通信。
答案 3 :(得分:0)
是的,您可以将C ++客户端(或C客户端或COBOL客户端或perl客户端或ruby客户端或...客户端)与Java服务器通信。您所做的只是将Java代码移植到等效的C ++代码(或C代码或COBOL代码或perl代码或ruby代码或...代码)。服务器既不知道也不关心客户端写入的语言。
我将从此引用Internet Sockets开始,然后使用POSIX API文档。
答案 4 :(得分:0)
我之前遇到过同样的问题。客户端是基于C ++的,它必须连接到我在Windows上运行的基于Java的服务器。我被困在最长时间,为什么Java服务器会在客户端连接时丢弃连接。
后来我意识到这是因为端点问题。 Java VM = big endian,C ++(在我的硬件上)是little endian。小问题,但需要一段时间才能找到这位业余爱好者。