您的位置:首页 > 移动开发 > Android开发

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

2015-01-26 18:27 381 查看
在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个字节的位置写入数据的长度。




以下是实例完整代码:

import java.io.*;

import java.net.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class TalkClient {
public static void main(String args[]) {
try {
Socket socket = new Socket("120.24.60.164", 6010);

// 由Socket对象得到输出流
DataOutputStream os = new DataOutputStream(socket.getOutputStream());

// 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String readline = "{\"cmd\":\"login\",\"username\":\"ceshi\",\"code\":\"123456\"}";

byte[] dataBuf = readline.getBytes();
int len = dataBuf.length;

ByteBuffer dataLenBuf = ByteBuffer.allocate(4);
dataLenBuf.order(ByteOrder.LITTLE_ENDIAN);
dataLenBuf.putInt(0, len);

ByteBuffer sendBuf = ByteBuffer.allocate(len + 4);
sendBuf.order(ByteOrder.LITTLE_ENDIAN);
sendBuf.put(dataLenBuf.array(), 0, 4);
sendBuf.put(dataBuf, 0, len);

// 向120.24.60.164的6010端口发出客户请求
os.write(sendBuf.array(), 0, len + 4);

// 刷新输出流,使Server马上收到该字符串
os.flush();
System.out.println("response:" + is.readLine());

os.close(); // 关闭Socket输出流
is.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
System.out.println("Error: " + e); // 出错,则打印出错信息
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: