【问题标题】:Sockets- Java not receiving the bytes in proper encoding [duplicate]套接字-Java未接收正确编码的字节[重复]
【发布时间】:2013-09-08 12:44:48
【问题描述】:

我正在使用套接字并实现 Java 服务器和 C++ 客户端。客户端正在向服务器发送一个类。 Java 服务器将它作为字节数组接收,但之后它不会将其转换回类成员。我看了很多,但我想我真的不知道要找什么。 以下是部分代码,完整代码挺大的

客户端 C++

IntVal temp; 
Set(temp,values);


int tempp;
tempp=send(s_id,&temp,sizeof(temp),0);
if(tempp==-1)
{
    printf("Sending Error \n");
}

“IntVal Class”有 7 到 8 个浮点值,没有成员函数。

服务器 Java

public static void main(String[] args) throws IOException {
        // TODO code application logic here
         Values values=new Values();
         gui display=new gui();
         display.setVisible(true);
        ServerSocket Sock=new ServerSocket(9090);
        try{
            while(true){
                System.out.println("Waiting");
                Socket socket=Sock.accept();

                    System.out.println("Connected");
                  InputStream ins=socket.getInputStream();
                    InputStreamReader insr= new InputStreamReader(ins);
                    BufferedReader br=new BufferedReader(insr);

                    byte[]Array=br.readLine().getBytes("UTF-8");
                   // values.SetValues(Array);
                    //display.SetValues(values);

                    values.tWidth=Array[0];
                    values.waterLevel=Array[4];
                    values.camHeight=Array[8];
                    values.camViewAngleY=Array[12];
                    values.camViewAngleX=Array[16];
                    values.distFromCamBank=Array[20];
                    values.distTwoPoints=Array[24];
                    values.AvgVelocity=Array[28];
                    values.crossSecArea=Array[32];
                    values.Flow=Array[36];
                    values.camTiltAngle=Array[40];
                    values.aboveWater=Array[44];
                    System.out.println(values.tWidth);
                    System.out.println(values.waterLevel);
                    socket.close();
                }

        }
        finally{
            Sock.close();
        }


    }
}

这里的 Class Values 等价于 c++ 客户端中的 IntVal 类。 如您所见,我只检查前两个值,它们显示垃圾值。 请指出正确的方向,这里有什么问题。

【问题讨论】:

  • C 代码从哪里获取数据,或者它应该如何工作并不明显。但是...首先,检查发送的字节是否真的是一个有效的 Java 类 - 将它们复制到磁盘上的一个文件并编写一些将尝试加载该类的内容 - 即完全从图片中取出套接字代码并确保你的数据很好。如果是,请检查线的两端是否使用相同的字节序(低位优先或高位优先)。
  • 它只是一个简单的 c++ 类……只有原始数据类型……即浮点数。并且数据正在其余代码中计算(此处未发布)...
  • 既然你正在发送字节[]并且你想把它变成一个字节[],你为什么把它读成文本而不是二进制呢? InputStream 已经是二进制的。此外,您似乎期望 4 字节 int 值,但您只使用最高字节。或者是float,我对你想要做什么感到困惑。

标签: java c++ sockets inputstream bufferedinputstream


【解决方案1】:

您自己对字节进行编码和解码,因此要为此负责的是您,而不是 Java。使用InputStream, 而不是Reader, 并直接处理字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多