【发布时间】:2015-03-17 11:00:00
【问题描述】:
我正在尝试使用 C++ 客户端和 Java 服务器创建一个简单的消息传递应用程序。
我似乎无法解决,因为 C++ 客户端无法从 Java 服务器获取信息,但我无法找到问题所在。
我已经尝试使用 Java 客户端连接到 Java 服务器,并且效果很好。
我已尝试将 C++ 客户端连接到为此目的而制作的简单 C++ 回显服务器,并且一切正常(它读取信息)。
我试过用java客户端连接到c++ echo服务器,效果很好。
请记住,Java 服务器从客户端获取所有信息,并且正在响应(例如:当我尝试登录时,服务器获取它,让我登录,并“发送”设置 cookie 的 http 响应并显示欢迎消息,但客户端永远不会收到它)。
这是发送回复的java代码:
while ((msg = tokenizer.nextMessage()) != null)
{
System.out.println("Received \"" + msg + "\" from client");
String response = (String)protocol.processMessage(msg);
System.out.println(response); // used for testing
if (response != null)
{
clientSocket.getOutputStream().write(response.getBytes("UTF-8"));
//the Out below this line is being initialized on connection, just put it here for you to read
//Also the out.println(response) doesn't work as well, those are 2 attempts i have made
//out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "UTF-8"), true);
//out.println(response);
}
if (protocol.isEnd(msg))
{
break;
}
}
这是客户端代码(C++):
//while (_socket.available() == 0){
// boost::this_thread::sleep(boost::posix_time::milliseconds(10));
// std::cout << "test";
//}
char reply[max_length];
size_t reply_length = boost::asio::read(_socket,boost::asio::buffer(reply,10));
//size_t reply_length = boost::asio::read(_socket, boost::asio::buffer(reply, _socket.available()));
std::cout << "Reply is:\n";
std::cout.write(reply, reply_length);
std::cout << "\n";
请注意,代码开头的 while 用于在每次发送消息后等待响应,我尝试将其替换为更长的睡眠时间,因此我不必检查传入缓冲区的大小,正如你在它之后看到的那样,我试图读取一个大小为 10 的缓冲区,只是通过测试,我将“真正的”读取行放在它后面的注释中。
任何帮助将不胜感激。
谢谢。
编辑 - 忘记提及如果我在发送信息通过后关闭套接字,但这样做没有达到目的,因为我试图保持套接字打开,直到客户端执行注销。
编辑#2-我尝试了一种不同的读取方法,通过使用分隔符字符并在当时读取缓冲区 1 个字符,它只是被空缓冲区阻塞。
这是我尝试过的第二种阅读方式的代码:
std::string respone = "";
char ch='0';
boost::system::error_code error;
try {
while(!error && ch!='$'){
size_t tmp=0;
try {
std::cout << "going to read:";
tmp = _socket.read_some(boost::asio::buffer(&ch + tmp, 1 - tmp), error);
std::cout << "finish reading 1 char";
if (error)
throw boost::system::system_error(error);
}
catch (std::exception& e) {
std::cerr << "recv failed (Error: " << e.what() << ')' << std::endl;
}
respone.append(1, ch);
}
}
【问题讨论】:
标签: java c++ boost client server