2015-09-29 121 views
0

我有一個ClientHandle接受請求的服務器,如果有一些,我想從Java發送數據到它。 (C++客戶端確實沒有任何問題)TCP Java客戶端發送數據到C++服務器

我已閱讀關於此的其他帖子,但他們沒有以任何方式幫助我。 Post1Post2Post3

bool ClientHandle::getData(std::shared_ptr<std::string> ptr) 
{ 
    int n; 
    ptr->clear(); 

    char size[4]; 
    n = recv(m_sock, size, sizeof(size), 0); 

    //check if retval passed 
    if (!checkRetValRecv(n)) 
     return false; 

    //calc how much data 
    auto msgLen = atoi(size); 
    LOG_INFO << "recv a message with size: " << msgLen; 

    //create buffer for the data 
    auto buffer = new char[msgLen]; 

    //read buffer 
    n = recv(m_sock, buffer, msgLen, 0); 

    //check retval if it passes 
    if (!checkRetValRecv(n)) 
     return false; 
    ptr->append(buffer, msgLen); 
    LOG_INFO << "Message: " << *ptr; 

    delete[] buffer; 
    return true; 
} 
bool ClientHandle::checkRetValRecv(const int& n) 
{ 
    if (n == SOCKET_ERROR) 
    { 
     size_t err = WSAGetLastError(); 
     if (err == WSAECONNRESET) 
     { 
      LOG_ERROR << "Failed to recv! Disconnecting from client: " << "Connection reset by peer."; 
     } 
     else 
     { 
      LOG_ERROR << "Disconnecting from client. WSAError: " << err; 
     } 
     m_connected = false; 
     return false; 
    } 

    if (n == 0) 
    { 
     LOG_INFO << "Client disconnected."; 
     m_connected = false; 
     return false; 
    } 
    return true; 
} 

現在我想編寫一個Java客戶端,該發送數據,但我不能甚而發送輸入數據的大小。

public class JClient{ 
    String m_host; 
    int m_port; 
    Socket m_sock; 
    OutputStreamWriter m_out; 
    BufferedReader m_in; 

    public JClient(String host, int port) 
    { 
     m_host = host; 
     m_port = port; 
    } 

    private void connect() throws IOException 
    { 
     m_sock = new Socket(m_host, m_port); 
     m_out = new OutputStreamWriter(m_sock.getOutputStream()); 
     m_in = new BufferedReader(new InputStreamReader(m_sock.getInputStream())); 
    } 

    private void close() throws IOException 
    { 
     m_sock.close(); 
    } 

    public void send(String json) throws IOException { 
     this.connect(); 
     m_out.write(json.length()); 
     m_out.flush(); 
     m_out.write(json); 
     m_out.flush(); 

     //wait for result 
     m_in.read(); 
     this.close(); 
    } 
} 

如果我嘗試發送,像這樣的數據:

JClient client = new JIMClient("localhost", 6060); 
String toSend = "{\"hello\":\"someJson\"}"; 
try { 
    client.send(toSend); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

我沒有收到任何有用的。 recv a message with size: 0,Client disconnected.

發送方法不起作用。我已經嘗試過其他Streams並使用不同的編碼,我猜這是其原因。所以問題是我如何解決這個問題與編碼在這裏?如果可能的話,我想盡可能地離開C++客戶端,或者讓它達到某種標準。

+0

問題在服務器上用C++代碼,還是在客戶端用Java代碼?通常不需要顯示工作代碼,只需向我們展示非工作代碼,並告訴我們在運行時會發生什麼。 –

+0

我確實收到了一個0的大小,但發送了一個20,我在第二個之前添加了它。我認爲這是一個編碼問題,因爲C++和java不需要具有相同的字符集編碼或我嘗試發送的整數的字節順序。我認爲這是客戶端,因爲服務器與C++ Client一起工作,它使用與服務器相同的功能來連接和發送數據。我確實展示瞭如何從客戶端接收數據。 (第一個大小爲int,然後數據塊爲char) – BennX

回答

3

Java代碼只發送單個字符的長度,但C++需要4個字節的字符串。你可以試試

m_out.write(String.format("%4d%s",json.length(),json)); 
m_out.flush(); 
+0

正確。你的答案後,我檢查了方法,並注意到「寫入int」只發送一個字節。非常感謝。現在工作正常。 – BennX

相關問題