単一の Java クライアントで単純な Boost ASIO サーバーをセットアップしようとしています。
2 つの間で文字列を送受信できます。しかし、double値を送ろうとすると相手にゴミしか出てこない。
以下は、私の基本的なセットアップ (C++ Boost ASIO サーバーと Java クライアントを使用) を示すスタンドアロン コードです。それらが実行されると、次の 4 つの連続したタスクが実行されます。
- クライアントはサーバーに文字列を送信します。これは正常に受信され、出力されます。
- サーバーは文字列をクライアントに送信します。これは正常に受信され、出力されます。
- クライアントは double 値をサーバーに送信します。これは受信されますが、正しく出力されません。
- サーバーは 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();
}
}
事前にどうもありがとうございました!!!
アーロン