Android 发送全4位的int整型数据到服务器

在App开发中常使用json与服务器Socket请求和解析服务器返回的数据。

为了确保在网络传输过程中没有丢失数据,一般会在发送请求数据前先发送把数据的长度发送到服务器。但数据的长度是需要发送全4位整型数据到服务器。

举个例子:使用手机号码和验证码登录

发送请求body为:{"cmd":"login","username":"ceshi","code":"123456"}

则数据的长度为:50。

我们都知道,一个byte有8位。那么数据长度50的二进制呈现是:110010。

全4位整型二进制的呈现是:00110010 00000000 00000000 00000000。

 

OutputStream提供write(int v)的方法,可以将int整型数据写入输入流中。但是却做不到全4位整型写入,只会发送110010,也就是只会发送1位整型数据。

那么DateOutputStream的writeInt(int v)总可以了吧。

实际上还是不可以,因为是不会在110010补0的。

需要通过nio里面的ByteBuffer。它提供了allocate(int capacity)一个可以分配大小的字节数组。

通过ByteBuffer.order(ByteOrder bo)低位补0。

最后通过putInt在第1个字节的位置写入数据的长度。

 

以下是实例完整代码:

[java] view
plain
copyprint?

  1. import java.io.*;  
  2.   
  3. import java.net.*;  
  4. import java.nio.ByteBuffer;  
  5. import java.nio.ByteOrder;  
  6.   
  7. public class TalkClient {  
  8.     public static void main(String args[]) {  
  9.         try {  
  10.             Socket socket = new Socket("120.24.60.164", 6010);  
  11.   
  12.             // 由Socket对象得到输出流  
  13.             DataOutputStream os = new DataOutputStream(socket.getOutputStream());  
  14.   
  15.             // 由Socket对象得到输入流,并构造相应的BufferedReader对象  
  16.             BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  17.   
  18.             String readline = "{\"cmd\":\"login\",\"username\":\"ceshi\",\"code\":\"123456\"}";  
  19.   
  20.             byte[] dataBuf = readline.getBytes();  
  21.             int len = dataBuf.length;  
  22.   
  23.             ByteBuffer dataLenBuf = ByteBuffer.allocate(4);  
  24.             dataLenBuf.order(ByteOrder.LITTLE_ENDIAN);  
  25.             dataLenBuf.putInt(0, len);  
  26.               
  27.             ByteBuffer sendBuf = ByteBuffer.allocate(len + 4);  
  28.             sendBuf.order(ByteOrder.LITTLE_ENDIAN);  
  29.             sendBuf.put(dataLenBuf.array(), 0, 4);  
  30.             sendBuf.put(dataBuf, 0, len);  
  31.               
  32.             // 向120.24.60.164的6010端口发出客户请求  
  33.             os.write(sendBuf.array(), 0, len + 4);  
  34.               
  35.             // 刷新输出流,使Server马上收到该字符串  
  36.             os.flush();  
  37.             System.out.println("response:" + is.readLine());  
  38.   
  39.             os.close(); // 关闭Socket输出流  
  40.             is.close(); // 关闭Socket输入流  
  41.             socket.close(); // 关闭Socket  
  42.         } catch (Exception e) {  
  43.             System.out.println("Error: " + e); // 出错,则打印出错信息  
  44.         }  
  45.     }  
  46.   
  47. }  
时间: 2024-09-28 07:55:41

Android 发送全4位的int整型数据到服务器的相关文章

Android PopupWindow全屏详细介绍及实例代码_Android

 Android PopupWindow全屏 很多应用中经常可以看到弹出这种PopupWindow的效果,做了一个小demo分享一下.demo的思路是通过遍历文件,找到图片以及图片文件夹放置在PopupWindow上面.点击按钮可以弹出这个PopupWindow,这里为PopupWindow设置了动画. PopupWindow全屏代码提要 受限需要自定义Popupwindow,这里不看Popupwindow里面要展示的内容,主要是设置Popupwindow的高度. public class Po

android 请求服务器-android发送请求到服务器,每次sessionid不同,怎么让它相同

问题描述 android发送请求到服务器,每次sessionid不同,怎么让它相同 我做了一个测试,如下图,在网上看到的帖子是设置cookie,在cookie中携带sessionid,但是还是不行呀,哪位大神帮忙看看? 解决方案 sessionid除了可以放在cookie之中,还可以放在URL参数中呀.如果Android端没保存cookie,或每次发送请求没带上cookie,服务器端都只好重新给它一个啦. 解决方案二: sessionid除了可以放在cookie之中,还可以放在URL参数中呀.如

Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)

Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改过了,现在应用更加方便点 http://blog.csdn.net/zhouzme/article/details/18940279 直接上代码了: ZHttpRequset.java package com.ai9475.util; import org.apache.http.HttpEntit

Android发送短信方法总结_Android

android API 中提供了SmsManager类处理短信.其中的sendTextMessage(num, null, content, pend, null)函数就是发送,具体介绍如下: SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员.公有方法: 1.ArrayList<String> divideMessage(String text) 当短信超过SMS消息的最大长度时,将短

关于Android发送短信获取送达报告的问题(推荐)

最近公司开发一个项目,要求app能够发送短信并获取送达报告.这本不是一个什么难题,实现这一功能的代码一搜一大把,那么这么简单的一个问题,为什么我要在这里提出来呢?那是因为我在写代码的时候掉入了一个坑,而且这很可能发生在很多和我一样粗心的朋友身上.先给大家分享一下当初让我掉进坑里的代码: 咋一看,好像这段代码并没有什么问题,但是在测试的时候发现无论发送多少条短信,每次都只能获取第一条短息的送达报告!!这个问题当时困扰了我很久,感觉自己明明没有写错啊,为什么会出现这样莫名其妙的问题呢?思索无果之后,

android-关于Android发送短信的扩展问题【具体见内容】,请大神指点

问题描述 关于Android发送短信的扩展问题[具体见内容],请大神指点 是这样的,程序中发送短信功能已经实现了. 因为我发的是类似验证码的信息,要对方同意并把这个验证码回馈给我才算双方达成"协议",但是现在短信内容可以在 短信 应用中看到,就是说我可以直接拿到对方的验证码. 请问有没有方法让这条短信不显示在系统的短信应用中,或者显示出来的是加密后的文字呢?或者发完之后直接删除也行啊-- 求帮助~先谢过大家了~ 解决方案 md5或许能帮上你,这是一种哈希讲明文转换为密文的算法吧

java 把64位long,转成2个32位的Int,再回转成long

java中long是64位,正好可以转成2个32位的int. 项目中正好 要做这种转换,所以,记录一下转换过程. 简单事例: long i = 55; int i1 = (int) i; int i2 = (int) (i << 32); System.out.println("i1:" + i1 + ";i2:" + i2); long l1 = (i2 & 0x000000ffffffffL) << 32; long l2 = i

android 发送post请求 PHP那边收到却是get消息

问题描述 android 发送post请求 PHP那边收到却是get消息 请求的代码是这样: List<NameValuePair> list = new ArrayList<NameValuePair>();list.add(new BasicNameValuePair(""username"" name));list.add(new BasicNameValuePair(""password"" p

android 发送http请求

Android 发送http请求 (1)发送post请求 Java代码   Map<String,String> person = new HashMap<String,String>();   person.put("os_version", SystemHWUtil.formatArr(version, ","));                   person.put("client_id", IMEI2);