当前位置: 首页 > 知识库问答 >
问题:

在Boost ASIO服务器和Java客户端之间通过TCP发送Double

诸葛康胜
2023-03-14

我试图用一个Java客户机建立一个简单的Boost ASIO服务器。

我能够发送和成功接收字符串之间的两个。然而,当我试图发送双值时,只有垃圾在另一端出来。

下面是显示基本设置的独立代码(使用C++Boost ASIO服务器和Java客户端)。当它们运行时,它们执行以下四个顺序任务:

    null
#include <iostream>
#include <string>

#include <boost/asio.hpp>
#include <boost/array.hpp>

using boost::asio::ip::tcp;

int main()
{
   unsigned short const PORT = 19876;

   try
   {
      boost::asio::io_service ioService;
      tcp::acceptor acceptor(ioService, tcp::endpoint(tcp::v4(), PORT));

      while (true)
      {
         // Listen for clients
         std::cout << "Listening for client..." << std::endl;
         tcp::socket socket(ioService);
         acceptor.accept(socket);
         std::cout << "Client heard..." << std::endl;

         size_t len;

         // Receive string from client and print it out
         boost::array<char, 128> cBuf;
         len = socket.read_some(boost::asio::buffer(cBuf, sizeof(cBuf)));
         std::cout.write(cBuf.data(), len);

         // Send string to client
         std::string message = "Server string to send to client\n";
         boost::asio::write(socket, boost::asio::buffer(message));

         // Receive double from client and print it out
         double dVal1 = -1.0;
         char * p_dVal1 = reinterpret_cast<char *>(&dVal1);
         len = socket.read_some(boost::asio::buffer(p_dVal1, sizeof(double)));
         std::cout << dVal1<< std::endl; // prints out garbage

         // Send double to client
         double dVal2 = 6.28;
         char const * p_dVal2 = reinterpret_cast<char const *>(&dVal2);
         boost::asio::write(socket, boost::asio::buffer(p_dVal2, sizeof(double)));
      }
   }
   catch (std::exception & e)
   {
      std::cerr << e.what() << std::endl;
   }

   return 0;
}
import java.io.*;
import java.net.*;

public class Client
{
    final static String HOST = "localhost";
    final static int    PORT = 19876;

    public static void main(String[] args) throws IOException
    {
        Socket socket = new Socket(HOST, PORT);

        // Send string to server
        PrintWriter pos = new PrintWriter(socket.getOutputStream(), true);
        pos.println("Client string to send to server");

        // Receive string from server
        BufferedReader bis =
            new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bis.readLine());

        // Send double value to server
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeDouble(3.14);

        // Receive double from server
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        System.out.println(dis.readDouble()); // prints out garbage

        socket.close();
        pos.close();
        bis.close();
        dos.close();
        dis.close();
    }
}

共有1个答案

蓝夕
2023-03-14

您需要使用lexical_cast,而不是reinterpret_cast

使用reinterpret_cast,您告诉编译器将double*位模式直接解释为常量字符*位模式。相反,您的强制转换应该使用ascii字符创建一个新结构,以ascii位模式表示数字。

此外,您应该确保您正在管理Endianess。您应该正确地在客户端和服务器上进行网络endianess的转换和从网络endianess的转换。有关其他信息,请参阅此答案。

 类似资料:
  • 问题内容: 我有一个C ++服务器和两个客户端(红宝石和Java)。一切都在64位linux机器(java 1.7.0_17)上运行。ruby客户端可以正常工作,但是java版本会出现问题。 在Java中,我尝试将字符串从客户端发送到服务器。实际上,服务器收到了整个字符串,但是服务器认为还有更多东西要接收。 红宝石客户端看起来像这样: 这里的一切工作正常。红宝石客户端发送一个字符串。服务器接收该字

  • 案例A: 服务器接收到这3条消息并发送最后一个答案,但是client上的recv失败,SOCKET_ERROR值为10060。使这种情况起作用的唯一方法是在客户端上的最后一次发送之后添加一个shutdown(...,SD_SEND)。 为什么A例会有这种行为?为什么只有在添加shutdown()命令时才工作? 服务器: 提前感谢!!!!尼古拉斯·米兰达S。

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

  • 我有以下情况, TCP服务器将接受来自客户端的连接 客户端将发送第一个请求,服务器将响应该请求,服务器必须在同一套接字上等待接收来自同一客户端的下一个请求 请参阅我所做的代码,使用此代码,服务器无法接收服务器发送的第二个请求,而客户端也在第二个接收中接收来自服务器的第一个响应。 请对此提出建议,代码中的问题是什么。 我试着模拟这个案例,如果有人以前遇到过,请尽快建议。

  • 创建 TCP 服务器 使用最简单的方法来创建一个 TCP 服务器,使用所有默认选项如下所示: NetServer server = vertx.createNetServer(); 配置 TCP 服务器 如果你不想默认值,可以将服务器配置通过传入一个NetServerOptions实例来创建它: NetServerOptions options = new NetServerOptions().s

  • 在探索和实现Proact设计模式后,遇到了一个问题,即客户端(“C”客户端)连接在限制后不再接受。开始探索netty。这是我试图做的1。C客户端建立连接2。Java服务器接受连接并开始使用TCP向客户端发送8 Mb大小的字节缓冲区。有什么想法吗?netty是一个好的选择吗?我浏览了netty的一个很好的例子,不幸的是不走运。 先谢谢你。 尊敬的Ravi