2011-01-06 10 views
1

Boost ASio Libraryを使用してC++でシンプルなTcpサーバーを作成しようとしています。私は2つのクラスTcpConnectionとTcpServerを書いた。Boost Asio io_service、クライアントからのメッセージを読む

私が必要とする動作は、Tcp Serverが接続されたすべてのクライアントにメッセージを送信でき、クライアントがサーバーに登録/登録解除できる必要があるということです。

私はサーバーからメッセージを送信することができました。私はクライアントからの読書に失敗しました。私のクライアントは、apache minaを使ってjavaで書かれています。

サーバコード

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呼び出しをインタリーブしていないことを確認してください"ということについてはっきりしていません。平均。読書用と書面用の2つのソケットを開くべきですか?私はそれが間違っていると思う。あなたは精巧にお聞かせください。 – Manoj

+0

いいえ、前の呼び出しが完了するまで(つまり、ハンドラが呼び出されるまで)特定のソケットで決してasync_readを呼び出さないでください。つまり、ハンドラが呼び出されます。 – Nim

+0

クライアントはメッセージを送信しますか?今は定期的に読んでいて、バッファーがいっぱいであふれています。また、一度読み込んだバッファをクリアするのは良い方法ですか? – Manoj

関連する問題