JAVA socket 接收硬件字节数据并解析

第一次接触这种类型的项目,在处理数据过程中,发现了许多问题,记录一下,加深记忆。

硬件将数据写在一个buffer中,传输过来的是字节。

一开始我们想到的是按照字节流来接收,但是,C语言中,byte类型没有符号位,最大值位255,java中byte类型带有符号位,最大值为127,问题就出现了,当接收到的字节数据超过127时,会取第一位为符号位,后几位补码,取反再加一变成负数。(处理方法后面有写到)

后来想偷懒不处理数据的基础上,考虑用char数组接收。char一共十六位,绝对是可以接收下硬件发来的八位数据的。但是再接收数据的时候,还是出现了问题。在对字节流转变为字符流并保存到char数组中的时候,char类型会自动对数据进行处理。在char类型中,字符所对应的最大十六进制是7F,但硬件传输来的数据存在如0X80,0X8D的情况。当char类型接收到大于7F的数据时,无法处理,字符会变成乱码的格式,数据相对应的也会发生改变。在接收数据的时候就无法正确存储,更别提后期对数据进行正确处理和校验了。放弃。

最终还是要回到byte接收的方向上。和同事讨论了下,对于超过java byte类型的数据,进行相应处理后,存放在Int中,即可保证数据正确性。

处理方法:

对byte数组中的数据进行判断,当为负数时,与0xff相与,并存放在Int数组中,可以保证数据正常

ServerSocket serverSocket;
    try {
	serverSocket = new ServerSocket(9090);
	System.out.println("***等待客户端连接***");
	Socket socket = serverSocket.accept();
	InputStream is = socket.getInputStream();
			
	byte[] datas = new byte[500];
	int count = is.read(datas);
			
	int[] dataFormat=new int[500];
	for(int i=0;i<datas.length;i++){
		if(datas[i]<0){
			dataFormat[i]=datas[i]&0xff;
		}else{
			dataFormat[i]=datas[i];
		}
	}
     } catch (IOException e) {
	e.printStackTrace();
     }
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 在 Java解析 POST 请求的代码如下: 1. 首先,使用 `java.net.Socket` 类创建一个 Socket 对象,连接到服务器。 2. 使用 `getInputStream()` 方法获取输入流,读取服务器发送的数据。 3. 使用 `BufferedReader` 对象读取服务器发送的数据,按行读取。 4. 读取 POST 请求头,获取请求参数的长度。 5. 使用 `read()` 方法读取请求参数的内容。 6. 关闭输入流和 Socket 对象。 下面是一个示例代码: ``` Socket socket = new Socket("example.com", 80); InputStream inputStream = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { if (line.startsWith("Content-Length: ")) { int contentLength = Integer.parseInt(line.substring("Content-Length: ".length())); char[] buffer = new char[contentLength]; reader.read(buffer, 0, contentLength); String requestBody = new String(buffer); // Do something with the request body... } } reader.close(); inputStream.close(); socket.close(); ``` 这段代码演示了如何连接到服务器、读取数据解析 POST 请求头和请求参数,以及关闭输入流和 Socket 对象。 希望这些信息对您有帮助! ### 回答2: 在Socket解析POST请求的代码如下所示: 首先,我们需要获取客户端发送的POST请求信息。在Socket通信中,请求信息通常在请求头中传递。因此,我们需要先读取Socket的输入流,获取请求信息。 ``` InputStream inputStream = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder requestBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { requestBuilder.append(line + "\n"); } String request = requestBuilder.toString(); ``` 接下来,我们需要从请求信息中解析出POST请求的参数。POST请求的参数通常是通过消息体以Key-Value的形式传递的。我们可以通过解析请求头中的Content-Length字段获取消息体的长度,并根据长度读取对应数量的字节流,并将其转换为字符串,从而获取消息体的内容。 ``` String messageBody = request.substring(request.lastIndexOf("\n") + 1); String[] params = messageBody.split("&"); Map<String, String> paramMap = new HashMap<>(); for (String param : params) { String[] keyValue = param.split("="); String key = URLDecoder.decode(keyValue[0], "UTF-8"); String value = URLDecoder.decode(keyValue[1], "UTF-8"); paramMap.put(key, value); } ``` 以上代码将解析POST请求的参数,并将其以Key-Value的形式存储在Map中。 最后,我们可以根据需要对参数进行进一步处理或响应。例如,可以根据参数执行相应的业务逻辑,然后将处理结果返回给客户端。 以上就是在Socket解析POST请求的代码示例。通过读取输入流,解析请求信息,提取参数,并对参数进行处理,我们可以实现对POST请求的解析和处理。 ### 回答3: Java解析POST请求的代码可以通过使用Socket连接来实现。以下是一个简单的示例代码: ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class PostRequestParser { public static void main(String[] args) { try { // 创建Socket连接 Socket socket = new Socket("localhost", 8080); // 构建POST请求 String request = "POST /api/endpoint HTTP/1.1\r\n" + "Host: localhost:8080\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 16\r\n\r\n" + "username=admin&password=123456"; // 获取输出流并发送请求 OutputStream outputStream = socket.getOutputStream(); outputStream.write(request.getBytes()); outputStream.flush(); // 获取输入流并读取响应 InputStream inputStream = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } // 解析响应 System.out.println(response.toString()); // 关闭连接 socket.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码通过创建一个Socket连接到指定的主机和端口,然后构建一个POST请求,发送请求并接收响应。请求中包含了请求头和请求体,请求体是以URL编码的形式发送的。通过输入流获取响应,然后可以对响应进行解析和处理。最后关闭连接。 注意:该示例代码仅做演示用途,并没有进行异常处理、完整的报文解析以及相关业务处理等。实际应用中需要根据具体需求进行改进和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值