0

単一の Java クライアントで単純な Boost ASIO サーバーをセットアップしようとしています。

2 つの間で文字列を送受信できます。しかし、double値を送ろうとすると相手にゴミしか出てこない。

以下は、私の基本的なセットアップ (C++ Boost ASIO サーバーと Java クライアントを使用) を示すスタンドアロン コードです。それらが実行されると、次の 4 つの連続したタスクが実行されます。

  1. クライアントはサーバーに文字列を送信します。これは正常に受信され、出力されます。
  2. サーバーは文字列をクライアントに送信します。これは正常に受信され、出力されます。
  3. クライアントは double 値をサーバーに送信します。これは受信されますが、正しく出力されません。
  4. サーバーは double 値をクライアントに送信します。これは受信されますが、正しく出力されません。

私が間違っていることを誰かが知っていますか?確かに、私はネットワーク (および Java) に非常に慣れていません。私はBoost ASIOのドキュメントと例を調べてきましたが、役に立ちました。

C++ ブースト ASIO サーバー コード:

#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;
}

Java クライアント コード:

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();
    }
}

事前にどうもありがとうございました!!!

アーロン

4

1 に答える 1