无法使用 Java 服务器的提升C++客户端读取
Cant read with a boost C++ client from a java server
我正在尝试使用C++客户端和Java服务器创建一个简单的消息传递应用程序。
似乎我无法绕过,因为C++客户端无法从 Java 服务器获取信息,但我无法追踪问题。
我尝试将 Java 客户端连接到 Java 服务器,效果很好。
我尝试将C++客户端连接到我为此目的制作的简单C++回显服务器,并且一切进展顺利(它会读取信息)。
我尝试将 java 客户端连接到 c++ echo 服务器,效果很好。
请记住,Java 服务器从客户端获取所有信息,并且正在响应(例如:当我尝试登录时,服务器会获取它,让我登录,并"发送"一个 http 响应,设置 cookie 并显示欢迎消息,但客户端永远不会收到它)。
这是发送回复的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++),关闭它解决了所有问题。
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 如何暂停插孔音频客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io