Java 增强Asio io_服务,从客户端读取消息 我试图用Boost ASIO库在C++中创建一个简单的TCP服务器。我编写了两个类TcpConnection和TcpServer

Java 增强Asio io_服务,从客户端读取消息 我试图用Boost ASIO库在C++中创建一个简单的TCP服务器。我编写了两个类TcpConnection和TcpServer,java,c++,tcp,boost-asio,Java,C++,Tcp,Boost Asio,我需要的行为是,Tcp服务器应该能够向所有连接的客户端发送消息,并且客户端应该能够向服务器注册/注销 我能够实现从服务器发送消息。我在阅读《来自客户》部分时失败了。我的客户机是用java编写的,使用ApacheMina 服务器代码 message = message + "\r\n"; const int bytesToSend = message.length(); boost::system::error_code error; boost::asio::write(socket, bo

我需要的行为是,Tcp服务器应该能够向所有连接的客户端发送消息,并且客户端应该能够向服务器注册/注销

我能够实现从服务器发送消息。我在阅读《来自客户》部分时失败了。我的客户机是用java编写的,使用ApacheMina

服务器代码

message = message + "\r\n"; 
const int bytesToSend = message.length(); 
boost::system::error_code error;
boost::asio::write(socket, boost::asio::buffer(message, bytesToSend), boost::asio::transfer_all(), error);
客户端代码

ConnectFuture future = ioConnector.connect(new InetSocketAddress(Port),
                new TriggerReceiverHandler();
System.out.println("Message Receiver started and listening on port "+ Port);
IoSession session = future.getSession();
session.write(new String("TEst Message From Client"));
在服务器上,读取消息的代码是使用async_read完成的

boost::array<char, 1> buf;
    boost::asio::async_read(socket, boost::asio::buffer(buf),
        boost::bind(&TcpConnection::handleRead, this, buf, boost::asio::placeholders::error));


void TcpConnection::handleRead(boost::array<char, 1> buf, const boost::system::error_code& error)
{
    if(!error)
    {
        std::cout << "Message: " << buf.data() << std::endl;
    }
    else
    {
        std::cout << "Error occurred." << std::endl;
    }
}
boost::阵列buf;
boost::asio::async_读取(套接字,boost::asio::buffer(buf),
boost::bind(&TcpConnection::handleRead,this,buf,boost::asio::placeholders::error));
void TcpConnection::handleRead(boost::array buf,const boost::system::error\u代码和错误)
{
如果(!错误)
{

首先,这似乎是不正确的

boost::array<char, 1> buf;
boost::阵列buf;
您正在声明大小为1的数组!我建议使用更大的数组

boost::array<char, 1500> buf;
boost::阵列buf;

除了缓冲区之外,我看不出您的代码有任何错误,只要检查您是否在同一个套接字上交错
async\u read
调用。

首先,这似乎不正确

boost::array<char, 1> buf;
boost::阵列buf;
您正在声明大小为1的数组!我建议使用更大的数组

boost::array<char, 1500> buf;
boost::阵列buf;

除了缓冲区之外,我看不出代码有什么问题,只是检查你不是在同一个套接字上“<代码> AycCyRead < /Cord>调用”。我建议你在C++和java中编写一个服务器和客户端,以了解它们是如何操作的。java客户端和服务器应该能够互相交谈,C++客户端和SER。我也建议你在C++和java中编写一个服务器和客户端,以了解它们是如何操作的。java客户端和服务器应该能够互相交谈,C++客户端和服务器也可以。这样你可以诊断出哪一个问题有问题。我不清楚什么是T。他“只需检查您没有在同一个套接字上交错异步读取调用。”意思是。我应该打开两个套接字,一个用于读取,另一个用于写入吗?我认为这是错误的。请详细说明。不,这意味着在前一个调用完成之前(即调用处理程序),您不得在特定套接字上调用

async\u read
好的,明白了…一个问题…当客户端发送消息时,我如何知道读取?现在我只是定期读取,直到缓冲区已满并溢出。读取后清除缓冲区也是一种良好的做法吗?您不需要这样做,只要您的句柄操作可以接受一个大小来指示缓冲区中有多少缓冲区。使用
async\u read
,您应该在连接时调用
async\u read
(异步等待来自客户端的数据-无需轮询),当有数据时,asio会给您回电话。在该处理程序中,设置下一个
async\u read
-有效地想象这是最好的方式,即您告诉asio,当将来有来自套接字的数据时,请让我知道。非常感谢!这会清除所有内容。但我的问题尚未解决。处理程序未被调用除非我手动触发readMessage()函数,否则我不清楚什么是“只需检查您没有在同一套接字上交错异步读取调用”意思是。我应该打开两个套接字,一个用于读取,一个用于写入吗?我认为这是错误的。请您详细说明一下。不,这意味着在上一次调用完成之前(即调用处理程序),您不能对特定套接字调用
async\u read
)好的,明白了…一个问题…当客户端发送消息时,我如何知道读取?现在我只是定期读取,直到缓冲区已满并溢出。读取后清除缓冲区也是一种良好的做法吗?您不需要这样做,只要您的句柄操作可以接受一个大小来指示缓冲区中有多少缓冲区。使用
async\u read
,您应该在连接时调用
async\u read
(异步等待来自客户端的数据-无需轮询),当有数据时,asio会给您回电话。在该处理程序中,设置下一个
async\u read
-有效地想象这是最好的方式,即您告诉asio,当将来有来自套接字的数据时,请让我知道。非常感谢!这会清除所有内容。但我的问题尚未解决。处理程序未被调用除非我手动触发readMessage()函数