TCP Java客户端向c++服务器发送数据

TCP Java client sending Data to a C++ Server

本文关键字:数据 服务器 c++ Java 客户端 TCP      更新时间:2023-10-16

我得到了一个服务器与ClientHandle接受请求,如果有一些,我想从Java发送数据到它。(c++客户端没有任何问题)

我读了其他关于这个的帖子,但他们没有以任何方式帮助我。Post1、Post2 Post3

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.

发送方法不工作。我已经尝试过其他流和使用不同的编码,我想这就是原因。所以问题是我如何解决这个问题与编码在这里?如果可能的话,我想让c++客户端保持原样,或者让它达到某种标准。

Java代码只发送一个字符的长度,但c++期望一个4字节的字符串。你可以试试

m_out.write(String.format("%4d%s",json.length(),json));
m_out.flush();
相关文章: