对于初学者,Android的网络通信是大家都喜欢但是又会感觉很难处理的模块。特别数据传输方面,初学者很可能犯一个很容易犯的错误,就是客户端通过字节数组或者对象与服务器端交换数据,但最后会发现它们都很不可行(用字节流时在与服务器端交互数据的时候很难操作控制,很难让服务器端知道什么时候应该开始下一步的处理;用对象交换数据的时候,交换要求是客户端和服务器端必须有类名、包名、内容完全相同的类,这样很难做到跨语言的通讯)。因此我采用了字符流的形式传送数据并对网络的访问做了一系列的封装,希望能够帮助到你。废话就不多说了,开始切入正题吧。
客户端与服务器端交互主要的思想为:客户端把数据转化为JSON格式的字符串再发给服务器端(字符串主要包含两个部分:操作码,数据。转化方式为:把数据传入到模板类的对象中,通过FastJson把对象转化为字符串)。服务器端接收到字符串之后再把字符串转化为模板类的对象(转化方式为:先通过FastJson把字符串转化为JSON对象格式的数据,再把JSON对象转化为模板类的对象),服务器端根据操作码来做不同的处理,处理之后把数据封装到模板类的对象中,FastJson再把模板类的对象转化为字符串传给客户端,客户端接收到字符串数据之后再把字符串数据转化为模板类的对象(转化方式同上),客户端再通过模板类做相应的处理。
客户端发送给服务器端的数据主要格式为:
{
code:1,
data:[
{
},{
}
]
}
服务器端发送给客户端的数据主要格式为:
{
ok:true,
data:{
}
}
或者
{
ok:true,
data:[
{
},{
}
]
}
看起来是不是很简单呢,那么开始代码讲解了吧。
安卓端:
主要使用到了如下几个类:
数据请求模板类RequestMessage(主要用来封装发给服务器端的数据) :
package com.szhushou.ssp.connection;
import java.util.Map;
public class RequestMessage {
private Integer code;//操作码
private Map<String, String> data;//传送给服务器端的数据
public void setCode(Integer code) {
this.code = code;
}
public void setData(Map<String, String> data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public Map<String, String> getData() {
return data;
}
}
网络传输核心类SocketConnection(主要用来封装最基本的数据传输类):
package com.szhushou.ssp.connection;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class SocketConnection {
private final static String TAG = "SocketConnection";
private final static String END = "#end#";//用来结束发送的字符串
private Socket client = null;
private BufferedReader ois = null;
private PrintStream oos = null;
public SocketConnection(String ip, int host) throws IOException {
client = new Socket(ip, host);
oos = new PrintStream(client.getOutputStream());
ois = new BufferedReader(new InputStreamReader(client.getInputStream()));
}
public String requestData(RequestMessage messageOut) throws IOException {
String result;
String json = JSON.toJSONString(messageOut);
sendString(oos, json);
result = readString(ois);
Log.i(TAG, result);
oos.close();
ois.close();
if (!client.isClosed()) {
client.close();
}
return result;
}
/**
*用来读取输入流的内容
*/
private String readString(BufferedReader ois) throws IOException {
String result;
String bufferText;
StringBuffer resultBuffer = new StringBuffer();
while (!(bufferText = ois.readLine()).equals(END)) {
resultBuffer.append(bufferText);
}
result = resultBuffer.toString();
return result;
}
/**
*用来写入数据到输出流
*/
private void sendString(PrintStream out, String text) {
out.prin