紧急求助!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还原成一个数,就会支持更大的负数