我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java socket如何接收保证能读完数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java socket如何接收保证能读完数据

这篇文章主要介绍java socket如何接收保证能读完数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

socket接收保证能读完数据

//    private static byte[] readData(InputStream in,byte[] bData) throws IOException{//      int readLength = in.read(bData);//      if(readLength!=bData.length){//          byte[] temp2 = readData(in,new byte[bData.length-readLength]);//          System.arraycopy(temp2, 0, bData, readLength, temp2.length);//          return bData;//      }else{//          return bData;//      }//    }//    private static void readData(InputStream in,byte[] bData) throws IOException{//      readData(in,bData,0,bData.length);//    }//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{//      int readLength = in.read(bData, off, length);//      if(readLength!=length){//          readData(in,bData,readLength+off,length-readLength);//      }//    }//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{////      while(true){//          int readLength = in.read(bData, off, length);//          if(readLength!=length){//              off = readLength+off;//              length = length-readLength;//          }else{//              break;//          }//      }//    }//    private static void readData(InputStream in,byte[] bData,int off,int length) throws IOException{//      int readLength = 0;//      do{//          off = readLength+off;//          length = length-readLength;//          readLength = in.read(bData, off, length);//      }while(readLength!=length);//    }        private static void readData(InputStream in,byte[] bData) throws IOException{        int off = 0;        int length = bData.length;        int readLength = 0;        do{            off = readLength+off;            length = length-readLength;            readLength = in.read(bData, off, length);        }while(readLength!=length);    }

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();     }

以上是“java socket如何接收保证能读完数据”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java socket如何接收保证能读完数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java socket如何接收保证能读完数据

这篇文章主要介绍java socket如何接收保证能读完数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!socket接收保证能读完数据// private static byte[] readData(Inp
2023-06-25

PHP中socket如何接收数据

在PHP中,可以使用socket函数来接收数据。下面是一个示例代码:```php$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket === false) {e
2023-09-26

socket传输接收不到数据如何解决

有几种可能的原因导致无法接收到数据:1. 网络连接问题:检查网络连接是否正常,确保服务器和客户端能够互相通信。2. 端口号问题:确保服务器和客户端使用相同的端口号进行通信。3. 数据发送问题:检查数据是否被正确发送到服务器,可以使用Wire
2023-09-12

java如何接收json数据

Java可以通过使用第三方库(如Jackson、Gson等)来接收和解析JSON数据。以下是使用Jackson库来接收JSON数据的示例代码:```javaimport com.fasterxml.jackson.databind.Obje
2023-09-22

MySQL是如何保证数据的完整性

数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进。 一. MySQL的二阶段提交 在Oracle和MySQL这种关系型数据库中,讲究日志先行策略
2022-06-01

Oracle中的数据完整性如何保证

在Oracle中,数据完整性可以通过以下几种方式来保证:主键约束:主键约束是一种在表中唯一标识每条记录的约束,可以确保表中的每条记录都有一个唯一的标识,防止重复数据的插入。外键约束:外键约束用来确保在两个表之间建立关系时,子表中的外键值必顠
Oracle中的数据完整性如何保证
2024-04-09

java中UDP如何接收数据

这篇文章给大家分享的是有关java中UDP如何接收数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程
2023-06-14

java如何实时接收数据

Java可以使用Socket来实现实时接收数据。Socket是一种网络通信协议,可以在不同主机之间传输数据。以下是一个简单的示例代码,演示了Java如何实时接收数据:```javaimport java.io.BufferedReader;
2023-08-20

Java如何使用Socket正确读取数据姿势

小编给大家分享一下Java如何使用Socket正确读取数据姿势,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言平时日常开发用得最多是Http通讯,接口调试也比较简单的,也有比较强大的框架支持(OkHttp)。个人平时用到
2023-06-25

java如何接收tcp协议的数据

在Java中,可以使用Socket类来接收TCP协议的数据。下面是一个简单的示例:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;import ja
2023-09-25

Teradata如何保证数据的一致性和完整性

Teradata通过以下方式保证数据的一致性和完整性:ACID事务: Teradata使用ACID(原子性、一致性、隔离性和持久性)事务来确保数据操作的一致性和完整性。这意味着数据操作要么完全成功,要么完全失败,以确保数据始终处于一致的状态
Teradata如何保证数据的一致性和完整性
2024-04-09

如何在java控制台中接收数据

如何在java控制台中实现接收数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java从控制台接收一个数字的实例详解功能:从控制台接收一个数实现代码:import jav
2023-05-31

云服务器如何保证数据安全性能

数据备份:云服务器会自动将数据备份到多个位置,以防止数据丢失或损坏。备份可以是定期自动备份或实时备份,以保证数据的安全性和可用性。数据恢复:如果出现数据丢失或损坏的情况,云服务器会自动尝试恢复数据。如果无法恢复,云服务器会提供快速恢复机制,用户可以在最短时间内恢复数据。容错机制:云服务器采用冗余机制来保护服务器的硬件和网络,以防止单点故障。当某个服务器出现故障时,其他服务器可以自动接管其工作,以确...
2023-10-27

Java如何使用jxl读取excel并保存到数据库

小编给大家分享一下Java如何使用jxl读取excel并保存到数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!项目中涉及到读取excel中的数据,保存到数据库
2023-05-31

php post不能接收数据的问题如何解决

这篇文章主要介绍“php post不能接收数据的问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php post不能接收数据的问题如何解决”文章能帮助大家解决问题。一、如何使用PHP接收P
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录