2011-01-06 5 views
1

Я пытаюсь создать простой сервер Tcp на C++, используя Boost ASio Library. Я написал два класса TcpConnection и TcpServer.Boost Asio io_service, Чтение сообщений от клиента

Поведение, в котором я нуждаюсь, заключается в том, что сервер Tcp должен иметь возможность отправлять сообщения всем подключенным клиентам, а клиенты должны иметь возможность регистрировать/отменять регистрацию на сервере.

Я смог достичь отправки сообщения с сервера. Я не увенчался успехом у читателей. Мой клиент написан в java, используя apache mina.

код сервера

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

Но handleRead не вызывался когда я запускаю сообщение, записывая сеанс с клиента. Скажите, пожалуйста, что я делаю что-то неправильно.

Буду признателен за любую помощь .. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Заранее спасибо.

+1

Я предлагаю вам написать сервер и клиент как на C++, так и на Java, чтобы скомпоновать, как они работают. Клиент и сервер Java должны иметь возможность разговаривать друг с другом и с клиентом и сервером C++. Таким образом, вы можете диагностировать, у какого конца есть проблема. –

ответ

1

Во-первых, это неверно!

boost::array<char, 1> buf; 

Вы объявляете массив размером 1! Я бы предложил нечто большее!

boost::array<char, 1500> buf; 

Помимо буфера, я не вижу ничего плохого с кодом, просто убедитесь, что вы не перемежении async_read звонков на тот же сокет.

+0

Я не совсем понимаю, что «просто убедитесь, что вы не чередовали вызовы async_read в том же сокете». имею в виду. Должен ли я открыть два сокета для чтения и один для написания? Я думаю, что это неправильно. не могли бы вы уточнить. – Manoj

+0

Нет, это означает, что вы никогда не должны вызывать 'async_read' в определенном сокете до тех пор, пока предыдущий вызов не завершится (т. Е. Обработчик не будет вызван) – Nim

+0

Ok Получил это ... Один вопрос, хотя ... Как узнать, когда клиент отправляет сообщение? Прямо сейчас я просто читаю периодически, и к тому времени буфер заполнен и переполнен. Также хорошо ли очистить буфер после чтения? – Manoj

Смежные вопросы