java - 无法从 Java 服务器使用 boost C++ 客户端读取

标签 java c++ boost client server

我正在尝试使用 C++ 客户端和 Java 服务器创建一个简单的消息传递应用程序。

似乎我无法解决,因为 C++ 客户端无法从 Java 服务器获取信息,但我无法追踪问题。

我已经尝试使用 Java 客户端连接到 Java 服务器,并且运行良好。

我已经尝试将 C++ 客户端连接到我为此目的制作的简单 C++ 回显服务器,一切进展顺利(它读取信息)。

我已经尝试将 java 客户端连接到 c++ 回显服务器并且它运行良好。

请记住,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 用于在每次发送消息后等待响应,我尝试用更长的 hibernate 时间替换它,这样我就不必检查传入缓冲区的大小,正如您在它之后看到的那样,我正在尝试读取大小为 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++),关闭它解决了所有问题。

关于java - 无法从 Java 服务器使用 boost C++ 客户端读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024626/

相关文章:

c++ - 使用 multiset_of boost bimap 查找

java - 如果多个用户同时处理它,使用单例模式是否会使我的应用程序变慢

java - 如何使用关于 mysql 驱动程序的 CLASSPATH? "Could not find driver with class name: com.mysql.jdbc.Driver"

c++ - 扫描项目/类中的 "dead"函数 (Visual Studio)

c++ - Boost.Preprocessor 是否可以实现二维序列?

通过 Netbeans 远程开发在 Linux 上的 C++ Boost:对 boost::filesystem::path::codecvt() 的 undefined reference

java - 在 switch case 中重新实例化变量

java - 需要澄清元素和索引之间的区别

c++ - 我如何使用 WTL::CHyperLink?

c++ - 把boost::ptr_vector<char>::iterator itr转换成里面的数据?