2011-01-06 113 views
1

我想在C++中使用Boost ASio庫創建一個簡單的Tcp服務器。我寫了兩個類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++客戶機和服務器通信。這樣你可以診斷哪一端出現問題。 – 2011-01-06 11:53:58

回答

1

首先這看起來不正確!

boost::array<char, 1> buf; 

您正在聲明一個大小爲1的數組!我會建議更大的東西!

boost::array<char, 1500> buf; 

除了緩衝區,我什麼都看不到你的代碼錯誤,只是檢查你是不是交織在同一插座上async_read電話。

+0

我不清楚什麼是「只檢查你是不是在同一個套接字上交錯async_read調用。」意思。我應該打開兩個插座,一個用於閱讀,一個用於書寫?我認爲那是錯誤的。你能否詳細說明一下。 – Manoj 2011-01-06 13:11:06