簡體   English   中英

TCP Java客戶端將數據發送到C ++服務器

[英]TCP Java client sending Data to a C++ Server

我有一個帶有ClientHandle的服務器,如果有請求,它將接受請求,我想從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: 0Client disconnected.

send方法不起作用。 我已經嘗試了其他Streams,並使用了不同的編碼,我想這就是原因。 因此,問題是如何使用此處的編碼解決此問題? 如果可能的話,我想離開C ++客戶端,或者將其升級為某種標准。

Java代碼僅發送單個字符作為長度,但是C ++期望使用4個字節的字符串。 你可以試試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM