Android Studio用okhttp连接服务器

  • Post author:
  • Post category:其他


在AndroidManifest写请求权限代码

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

先写客户端的代码

在你的Android布局文件中创建一个button,如下

    <Button
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
        android:text="test"
        android:onClick="tset"
        android:layout_weight="0.5"
        />

然后在MainActivity中添加test按钮的点击事件

Request.Builder().url(“http://192.168.56.1:8050/demo1_war_exploded/base”).build();

url中写的是你需要传输信息的ip,如果是本地服务器可以在cmd里通过ipconfig查看自己电脑的ip地址

demo1_war_exploded是服务器的项目名,base是我的servlet-name

    public void tset(View view) {

        Button btn = (Button) findViewById(R.id.test);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View view) {
                new  Thread(new Runnable() {
                    @Override
                    public void run() {

                        OkHttpClient client = new OkHttpClient();

                        final Request request = new Request.Builder().url("http://192.168.56.1:8050/demo1_war_exploded/base").build();
                        client.newCall(request).enqueue(new Callback() {
                            @Override
                            public void onFailure(Request request, IOException e) {

                                String  error = e.getMessage();
                                Log.d("error",error);
                            }



                            @Override
                            public void onResponse(Response response) throws IOException {
                                if(response.isSuccessful()){//回调的方法执行在子线程。
                                    Log.d("kwwl","获取数据成功了");
                                    Log.d("kwwl","response.code()=="+response.code());
                                    Log.d("kwwl","response.body().string()=="+response.body().string());
                                }
                                if(response.isSuccessful()){

                                    String json = response.body().toString();

                                    InputStream is =      response.body().byteStream();

                                    ByteArrayOutputStream bos = new ByteArrayOutputStream();

                                    int readed = 0;

                                    byte buf[] = new byte[1024];

                                    while ((readed = is.read(buf, 0, buf.length)) != -1) {

                                        bos.write(buf, 0, readed);

                                    }

                                    byte[] result = bos.toByteArray();

                                    Log.e("result","result:"+ new String(result));

                                    is.close();

                                    bos.close();

                                    buf=null;

                                }

                            }

                        });
                    }
                }).start();
            }

        });
    }

然后编写服务器端的代码,我是用的idea写的服务器

新创建一个servlet

在这里插入图片描述

然后输入以下代码

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import java.io.PrintWriter;

/**
 */
public class BaseServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        handleRequest(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
        handleRequest(req,resp);

    }

    private void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        req.setCharacterEncoding("UTF-8");  // 设置字符集
        resp.setCharacterEncoding("UTF-8");
        resp.setHeader("Cache-Control", "no-store");
        PrintWriter out = resp.getWriter(); // 准备输出
        out.println("<html>");
        out.println("<head><title>WEB开发</title></head>");
        out.println("<body>");
        out.println("<h1>Hello World</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();// 关闭输出

    }
}

并在web.xml中添加如下代码

    <servlet>

        <servlet-name>base</servlet-name>
        <servlet-class>BaseServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>base</servlet-name>

        <url-pattern>/base</url-pattern>

    </servlet-mapping>

最后测试一下

在这里插入图片描述

在这里插入图片描述

出现如下就成功了

注意如果你使用的是Android 9及以上,okhttp是不能访问https的,会直接失败。需要在res/下创建一个xml文件夹,然后创建一个network_security_config.xml添加代码

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

再在AndroidManifest中添加

<application
	......
	android:networkSecurityConfig="@xml/network_security_config">
</application>

如果测试还是不成功,请查看下手机模拟机的Android版本,跟换模拟机Android9以下就可以



版权声明:本文为m0_43421409原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。