现有对端是下位机一台通过ip转串口映射访问(工控设备只能接受特定指令代码然后反馈结果),现在下位机需要接受客户端发送过去的一串16进制的命令请求,然后返回结果,由于需要做成b/s的模式,所以现在想用java做一个客户端,请问该如何书写?用socket的话;因为java中在socket中只能传byte的数组;而byte的范围有限(-127~128)对于大的数就会溢出;请问如何解决?如果传字符串也需要转换成16进制的字节数组也存在一个可能溢出的问题。请问有什么好的办法解决?谢谢!
下面是我的代码,请指教:// 创建输入输出数据流
Socket s = null;
DataOutputStream dos = null;
DataInputStream dis = null;
s = new Socket("192.168.0.11", 9707);//需要数据传向的地址端口传输是透明传输由路由器解决不用考虑ip包的打包及解包
    dos = new DataOutputStream(s.getOutputStream());
    dis = new DataInputStream(s.getInputStream());//字节数组(需要发送的指令)
byte[] b = new byte[10];
b[0] = (byte) 0xf8;
b[1] = (byte) 0xf9;
b[2] = (byte) 0x0f;
b[3] = (byte) 0xff;
b[4] = (byte) 0x24;
b[5] = (byte) 0x00;
b[6] = (byte) 0xfe;
b[7] = (byte) 0xff;//System.out.println(b[1]);已经就溢出显示为-7
// 发送数据
dos.write(b);
dos.flush();

解决方案 »

  1.   

    采用tcp传输,然后传输前自己拆分数据
      

  2.   

    现在就是用的tcp方式的客户端;拆分数据如何实现?主要传的时候要把那串指令一起传过去,所以要放在字节数组中。但是由于溢出问题产过去的数据不能正确接收。
      

  3.   

    soket也可以传递stringbuffer,用这个可不可以啊
      

  4.   

    这个不是不能传String;String字符串可以传输;我通过超级终端和我编的客户端可以相互收发字符串;不过对端接下位机时必须要接收16进制的数据;而不是字符串。必须是正确的16进制的数据过来才能响应。和vc里的串口调试类似;不过这里不用直接操作串口,是通过ip+端口把数据直接发向串口的。
      

  5.   

    楼主理解上有误区。
    Socket底层传输的其实都是2进制数据流。
    在数据接收模式上是分两种:二进制形式和文本形式(相当于前者的子集)。最终都转化成2进制数据流。
    而16进制,其实就是二进制的一种字面表现形式,内里的数据一般可以认为是一回事。
    所以楼主如果想传递一些16进制格式的数据,只要以二进制形式发送和接收就行了。
      

  6.   

    谢谢楼上的回答;现在一个问题是需要以数组的方式传送一段指令而不是只传一个数,而byte[]数组又不支持无符号数,如果传大于80的16进制的数就会溢出成为负数,这样对端接受不到正确的指令。
      

  7.   

    套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
      

  8.   

    而byte[]数组又不支持无符号数
    这句你就错了,byte为什么不支持无符号,那是因为一个byte大小为-127---128,如果你把两个byte还原成一个数,就会支持更大的负数