我和TCP进行通信,发送出去指令后返回来的数据不对
public static void main(String[] args) {
SpringApplication.run(VersolApplication.class, args);
try {
// 建立TCP连接
Socket socket = new Socket("150455.cnsh.iot-tcp.com", 15000);
// 获取输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
// 发送数据
//16进制转byte
byte[] data1 = Hex2Bytes("C903007300016599");
//byte[] data = new byte[]{data1};
outputStream.write(data1);
// 接收数据
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
byte[] response = new byte[len];
//byte转16进制
String string = byte2HexWithBlank(new byte[len]);
System.out.println("string: " + data1);
System.arraycopy(buffer, 0, response, 0, len);
// 处理返回数据
System.out.println("Received: " + string);
// 关闭连接
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
控制台输出
接收数据的方式可能存在问题
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
byte[] response = new byte[len];
String string = byte2HexWithBlank(new byte[len]);
System.out.println("Received: " + string);
System.arraycopy(buffer, 0, response, 0, len);
这里使用了 inputStream.read(buffer)
方法来接收数据,并将接收的数据存放在了 buffer
数组中,然后使用 byte2HexWithBlank
方法将字节数组转换为了字符串并输出。这种方式可能存在问题,因为 inputStream.read(buffer)
方法并不能保证一次性将所有数据都读取完毕,可能会出现读取不完整的情况,因此需要根据实际情况进行调整。另外,在输出之前,应该先将 response
数组中的数据转换为字符串,而不是直接输出 string
变量。
修改后的代码:
public static void main(String[] args) {
SpringApplication.run(VersolApplication.class, args);
try {
// 建立TCP连接
Socket socket = new Socket("150455.cnsh.iot-tcp.com", 15000);
// 获取输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
// 发送数据
byte[] data = Hex2Bytes("C903007300016599");
outputStream.write(data);
// 接收数据
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byte[] response = new byte[len];
System.arraycopy(buffer, 0, response, 0, len);
// 处理返回数据
String string = byte2HexWithBlank(response);
System.out.println("Received: " + string);
}
// 关闭连接
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
主要的修改包括:
您的代码中,发送的数据是C903007300016599,但是返回的数据是C9 03 02 00 00 59 94。这个问题可能是由于您的代码中发送的数据格式不正确导致的。您可以尝试使用以下代码来发送数据:
byte[] data1 = new byte[]{(byte)0xC9, (byte)0x03, (byte)0x00, (byte)0x73, (byte)0x00, (byte)0x01, (byte)0x65, (byte)0x99};
outputStream.write(data1);
这个代码将发送C903007300016599这个16进制字符串。如果您仍然无法解决问题,建议您检查一下网络连接是否正常,或者检查一下其他日志文件以查找问题所在。
希望这可以帮到您!