无法从java服务器读取boost C ++客户端

时间:2015-01-19 12:25:18

标签: java c++ boost client server

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

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

我尝试将Java客户端连接到Java服务器,但效果很好。

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

我尝试将java客户端连接到c ++ echo服务器,但效果很好。

请记住,Java服务器从客户端获取所有信息,并且正在响应(例如:当我尝试登录时,服务器获取它,登录我,并且"发送" a 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的缓冲区,仅仅是测试,我把&#34;真正的&#34;在它之后的评论中读取行。

任何帮助都将不胜感激。

谢谢。

编辑 - 忘记提及如果我在发送信息传递后关闭套接字,但这样做失败了,因为我试图保持套接字打开直到客户端执行注销。

EDIT#2-我尝试了一种不同的读取方法,通过使用分隔符char并在当时使用缓冲区1 char,它只会被空缓冲区阻塞。

以下是我尝试过的第二种阅读类型的代码:

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);
        } 
    }

1 个答案:

答案 0 :(得分:0)

有点傻,但我的反病毒很可能阻止了来自java服务器的所有数据包(而不是因为某些原因而不是c ++),关闭它解决了所有问题。