日期:2014-05-20  浏览次数:20833 次

紧急求助!java如何通过socket发送16进制的数据包(在线等)
现有对端是下位机一台通过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();


------解决方案--------------------
采用tcp传输,然后传输前自己拆分数据
------解决方案--------------------
soket也可以传递stringbuffer,用这个可不可以啊
------解决方案--------------------
楼主理解上有误区。
Socket底层传输的其实都是2进制数据流。
在数据接收模式上是分两种:二进制形式和文本形式(相当于前者的子集)。最终都转化成2进制数据流。
而16进制,其实就是二进制的一种字面表现形式,内里的数据一般可以认为是一回事。
所以楼主如果想传递一些16进制格式的数据,只要以二进制形式发送和接收就行了。
------解决方案--------------------
套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
------解决方案--------------------
而byte[]数组又不支持无符号数
这句你就错了,byte为什么不支持无符号,那是因为一个byte大小为-127---128,如果你把两个byte还原成一个数,就会支持更大的负数