【问题标题】:TCP Java client sending Data to a C++ ServerTCP Java 客户端向 C++ 服务器发送数据
【发布时间】:2015-12-26 14:47:33
【问题描述】:

我有一个带有 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.

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

【问题讨论】:

  • 是C++代码的服务器问题,还是Java代码的客户端问题?通常不需要显示工作代码,只需向我们展示非工作代码并告诉我们运行时会发生什么。
  • 我确实收到了 0 作为大小,但发送了 20,我在一秒钟前添加了它。我认为这是一个编码问题,因为 c++ 和 java 不需要具有相同的字符集编码或我尝试发送的整数的字节顺序。我认为它是客户端,因为服务器与 c++ 客户端一起使用,它使用与服务器相同的功能来连接和发送数据。我确实展示了我如何从客户端接收数据的工作。 (首先大小为 int,然后数据块为 char)

标签: java c++ tcp


【解决方案1】:

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

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

【讨论】:

  • 对。在您回答后,我检查了方法并注意到“write int”只发送一个字节。非常感谢。现在一切正常。
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 2016-02-23
  • 2014-04-08
  • 2014-03-08
  • 2021-02-21
  • 1970-01-01
  • 2015-02-17
  • 2015-02-10
相关资源
最近更新 更多