如何在服务器和客户端之间进行异步通信

时间:2016-06-19 00:56:26

标签: c++ boost-asio

好的,此代码处理服务器和客户端之间的服务器端通信。我对boost :: asio不太熟悉,但我在几个教程后都尽力了。但是,当我尝试在我的客户端(我还没有构建它,所以我使用putty)和服务器之间进行通信时仍然存在一个问题。服务器仅在客户端关闭连接时才接收数据。我只是想知道是否是这种情况,如果是这样,我如何回应客户端请求?

这是启动服务器的功能(缩短了,我删除了错误处理机制)

void Initialize(){
    boost::asio::io_service ioservice;
    Network network(ioservice);
    ioservice.run();
}

以下是开始接受连接的功能

void Network::StartAccept(){
  Connection::pointer new_connection = Connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->getSocket(),
     boost::bind(&Network::HandleAccept, this, 
     new_connection, boost::asio::placeholders::error));
}

此功能处理接受并再次启动另一个接受

void Network::HandleAccept(Connection::pointer new_connection, const boost::system::error_code & error){
if (!error)
{
    //sio::cout() is one of my functions that automatically time stamps everything and ends the line if needed
    sio::cout("Client Connected from Origin: ", false);
    sio::cout(new_connection->getSocket().remote_endpoint().address().to_string(), true, false);
    new_connection->start();
}
else {
    sio::cout("Could Not Accept Connection to Client");
}
StartAccept();

}

此函数处理客户端I / O

void Connection::start() {
//message_ = "Hello World";

//boost::asio::async_write(socket_, boost::asio::buffer(message_), boost::bind(&Connection::handle_write, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
boost::asio::async_read(socket_, msg, boost::bind(&Connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

}

我希望能够将“hello world”写入客户端然后读入客户端所说的内容,但是如果我async_write(已注释掉),则会断开客户端和{{ 1}}因为没有连接而吐出错误

TLDR 如何保持连接打开,或者我不认为

1 个答案:

答案 0 :(得分:1)

我解决了我的问题,最初我想让客户端将信息发送到服务器然后服务器进行响应。我想出了怎么做。 @Arunmu让我觉得PuTTY引起了一些问题,因为当他指出它时我更深入地研究它。

原来,PuTTY正在关闭窗口而不显示服务器端消息,因为它认为退出成功。我唯一需要改变的是我发布的最后一个功能。

void Connection::start() {
    boost::asio::async_read_until(socket_, msg, "\n",
     boost::bind(&Connection::handle_read, shared_from_this(),
     boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

}

该功能按照我的意愿工作,至少在某种程度上如此。我必须编写的客户端每次想要询问服务器时都必须创建一个新连接。