用OKHTTP框架做服务器通信

       人生中第一次写博客,也就是大学大二期间。我认为记录这些点点滴滴的经验和知识有两点必要。第一,是能够记录自己在学习IT之路的一些经验和知识的整理;第二,把自己所理解的知识点更能详细分享给喜欢编程的每一个人,希望读者看了这些能够有所帮助,虽然别人也写到同样的知识,但是我通过学习这个知识点再加上我的个人理解来记录下来,有些知识说的不到位请各位批评改正!

      言归正传,下面来讲一下利用okhttp做服务器通信(socket通信),之前大多数开发者用的是流的通信方式,自从安卓提供okhttp框架之后,实现客户端与服务器的通信更方便快捷了,废话不多说,下面我进行一一讲解!TT

搭建OkHTTP框架之前;

注意

1、在build中加入okhttp,Gson的架包,修改build.gradle(app)中加上:

compile 'com.squareup.okhttp:okhttp:2.4.0'

,因为版本过低会出现问题;

2、在AndroidManifest中增加请求网络的权限(如不加,APP连不上网络);

<uses-permission android:name="android.permission.INTERNET" />

 1、首先创建okhttp对象,设置为全局(以下操作都围绕该对象来做的)

OkHttpClient okHttpClient = new OkHttpClient();

2、第二步,对该对象进行封装(里边携带往服务器发送的相关参数(如果不是自己服务器参考该服务器开发文档)和URL(服务器提供的接口API))

 Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                MediaType JSON = MediaType.parse("application/json; charset=utf-8");

                List<Map<String, String>> list = new ArrayList<>();//将JSON数据以Map形式存储到list中去,以List数组形式存储着数据;
                Map<String, String> map = new HashMap<>();        //建立Map对象,向Map添加数据;
                map.put("StartTime", "2018-01-11 09:14");
                map.put("EndTime", "");
                map.put("Interval", "5");
                map.put("Start", "0");
                map.put("Limit", "1");
                map.put("Order", "1");
                list.add(map);
                JSONObject jsonObject = new JSONObject(map);        //创建JSONObject对象;

                String string = jsonObject.toString();              //将jsonObject对象转换成字符串;
                RequestBody body = RequestBody.create(JSON, string);//将JSON数据打包成Body通过post上传;
                Request request = new Request.Builder()
                        .url(Get_All_url)                           //该服务器的api(URL)
                        .addHeader("userkey", "55656535336494b84c749b31453ea55")
                        .post(body)
                        .build();
                executeRequest(request);
            }
        });
        t1.start();

做服务器连接是一个耗时的工作要在线程里完成,这里我将发往服务器的相关参数封装到Map里边然后将Map放到List中将List打包成JSONobject对象,然后将对象转化成字符串才能封装成传输数据的body才能上传服务器,body“相当于人的身体”,将其封装到request对象中,如果相关服务器有相关的key标识的话,可以通过addHeader键值对方式存到request头部,这样一个完整的数据包打包成功了,可以通过executeRequest(request)发送到服务器!

补充:在以上封装数据的时候可能与别的博主写的不同,但是用这个List/map的格式封装感觉更易懂一些,下面就详细说一下。

我们通常看到别人的okhttp上传都是用到的FormEncodingBuilder可以简单理解为表单的形式,代码如下:

 

 
FormEncodingBuilder builder = new FormEncodingBuilder ();
builder.add("username","admin");
builder.ass("password","123");
Request request = new Request.Builder()
                        .url(https://mp.csdn.net/)                 //该服务器的api(URL)
                        .addHeader("userkey", "2312333321323")     //头部标识(不需要可去掉)
                        .post(builder.builde())
                        .build();
                executeRequest(request);

我们都知道网络通信的格式大多数Json数据,我们要利用map和List的结合打包成Json数据,下面举个例子:
比如我们要打包成这种形式的Json数据:

                Map<String, String> map1 = new HashMap<>();//生成一个Map类型对象map1                
                Map<String, String> map2 = new HashMap<>();//生成一个Map类型对象map2
                map1.add("Name","T1");
                map1.add("Value","1");
                map2.add("Name","01H1");
                map2.add("Value","96.2");

在Json数据中一个{}里的内容就称为一个对象,{"Name":"T1","Value","1"}称为一个对象,我们将这个对象数据以Map键值对类型存到map1中,同理将第二个Json对象存放到map2中去,map1、map2就可以封装成{"Name":"T1","Value","1"},{"Name":"01H1","Value","96.2"}的形式,我们可以清楚的看到两个{}对象最外层还包含着一个[]的括号,我们就可以将[]用List来表示,那List存放的数据类型是什么呢?不明思义,当然是{}两个json对象咯,{}两个对象用map封装的,所以List中存放着Map类型的数据,我们可以这样声明并添加:

  List<Map<String, String>> list = new ArrayList<>();
  //我们将封装好的map1和map2添加到list中去
  list.add(map1);
  list.add(map2);
  //我们将list装换成JsonArray数组形式
  JsonArray jsonarray = new JSONArray(list);
  //我们再把jsonarray形式转化成字符串就可以上传了
  String str = jsonarray.toString();
  RequestBody body = RequestBody.create(JSON, str);

经过以上的层层封装,我们终于把数据封装成想要的样子,简单总结一下,{}的数据用Map键值对进行封装,而[]
Json数组形式用List封装,最后那List转化成JsonArray数组形式就可以得到想要的数据了!
注意:如果Json数据只由{}对象形式封装成的,我们可以将map转化成JsonObject对象,然后将JsonObject妆化成字符串上传服务器!

JsonObject jsonobject = new JSONObject(map1);
String str = new jsonobjct.toString();

经过上边的讲解你是否可以封装任意Json数据了呢?

3、第三步是来对服务器返回的数据做处理

该OKHTTP框架也提供了简单的服务器回调方法,下边我们来看一下:

//服务器返回调用函数
private void executeRequest(Request request) {

    //3.将Request封装为Call
    Call call = new OkHttpClient().newCall(request);
    //4.执行call
    call.enqueue(new Callback() {

        @Override//回调错误时
        public void onFailure(Request request, IOException e) {
            
        }

        @Override//回调成功时
        public void onResponse(Response response) throws IOException {
            final String relsult = response.body().string();//接收服务器返回来的信息
             try {
               JSONArray jsonarray = new JSONArray(relsult);//将返回的信息转换成JSON形式
                       
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}

当服务器进行响应时,会自动的调用executeRequest()函数,回调函数中自带的两种相应方法分别为服务器响应失败和服务器响应成功,开发人员可以在其中做相应的解析和回调!

    有什么错误或需要改正的地方,请在下方评论!谢谢!如果对你有帮助,您的赞是对我最大的支持!

       

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 OkHttp 实现 Socket 通信的示例代码: ```java import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; import okio.BufferedSink; public class SocketClient { private static final String HOST = "example.com"; // 服务器地址 private static final int PORT = 12345; // 服务器端口号 private static final MediaType MEDIA_TYPE_PLAIN_TEXT = MediaType.parse("text/plain"); private OkHttpClient client; private Socket socket; private BufferedSink sink; public void connect() throws IOException { client = new OkHttpClient(); socket = new Socket(); socket.connect(new InetSocketAddress(HOST, PORT), 5000); // 连接超时时间为 5 秒 sink = Okio.buffer(Okio.sink(socket)); } public void disconnect() throws IOException { socket.close(); } public void send(String message) throws IOException { sink.writeUtf8(message); sink.flush(); } public String receive() throws IOException { Request request = new Request.Builder() .url("http://" + HOST + ":" + PORT) .post(RequestBody.create(MEDIA_TYPE_PLAIN_TEXT, "")) .build(); Response response = client.newCall(request).execute(); ResponseBody body = response.body(); if (body == null) { return null; } return body.string(); } } ``` 在上面的代码中,我们使用 OkHttp 的 `OkHttpClient` 类来发送 HTTP POST 请求,以接收服务器发送的消息。`send` 方法使用 Okio 的 `BufferedSink` 类将消息写入 Socket 连接。使用时需要注意在合适的时机调用 `connect` 方法连接服务器,并在不需要连接时调用 `disconnect` 方法断开连接。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值