前言
对于逆向工程师,网络接口往往是我们首选的突破接口,逆向网络接口前,我们首先还是熟悉网络编程开发,直就是所谓的知“开” 知 “逆”,方能百“逆”不挫,今天就给大家分享我的Android的网络编程第一篇笔记。
Socket编程
不管什么网络编程框架,最终本质上都是使用使用Socket编程,都是在Socket的基础之上进行封装。所以我们来看看最原生的Socket网络编程框架。
服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
/**
* 基于TCP协议的Socket通信,实现用户登录,服务端
*/
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
//3、获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();
InputStreamReader isr =newInputStreamReader(is);
BufferedReader br =newBufferedReader(isr);
String info =null;
while((info=br.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
//5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
//客户端
//1、创建客户端Socket,指定服务器地址和端口
Socket socket =newSocket("localhost",10086);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
//3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
System.out.println("我是客户端,服务器说:"+info);
}
//4、关闭资源
br.close();
is.close();
pw.close();
HTTP/UDP/TCP
网络世界和我们现实中的快递行业很相似。我们发起网络请求,需要填写对方IP和端口号。我们寄发快件也需要填写收货人的地址和电话号码。 快递中转站类似我们的路由器。这么一想网络世界就生动形象多了,UDP/TCP 有点类似网络世界的两个快递公司,UDP这家公司的特点,快,但是安全性得不到保证, TCP这家快递公司的特点安全,但是有时会慢。其实两家公司只是个有特点,没有好坏之分。我们根据不同业务选择不同快递公司而已, 我们VOIP业务选择UDP, 我们即时聊天消息使用TCP。HTTP可以类似某一家TCP公司的代理公司,HTTP有对客户的数据进行一次自己格式打包,然后交由TCP公司帮忙传输。
OkHttp编程
现在Android网络编程已经摒弃了apache的httpclient和Android自身的URLConnection,强烈推荐Okhttp,而且市面上常用的app也是使用Okhttp,比如美团,小红书等。所以,有必要给大家介绍一下Okhttp的编程。
Okhttp编程主要分为四个流程:
1.创建一个OkHttpClient 对象;
2.构造一个Request 请求;
3. OkHttpClient 对象 equest 请求=> Call 对象;
4. Call 执行 (Call执行有两种方式:同步和异步)。
同步/异步
同步请求—即,执行请求的操作是阻塞式,直到 HTTP 响应返回。它对应 OKHTTP 中的 execute 方法。
同步请求代码如下:
private static void testPostSync() throws IOException {
// 1.创建一个OkHttpClient 对象
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构造一个Request 请求
Request request = new Request.Builder()
.url("https://www.baidu.com")
.get()
.build();
// 3. OkHttpClient 对象 equest 请求=> Call 对象
Call call = okHttpClient.newCall(request);
// 4. Call 同步执行
Response rep = call.execute();
System.out.println(rep.body().string());
}
异步请求—就类似于非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者。它对应 OKHTTP 中的 enqueue 方法。
private static void testPostAsync() throws IOException {
// 1.创建一个OkHttpClient 对象
OkHttpClient okHttpClient = new OkHttpClient();
// 2.构造一个Request 请求
Request request = new Request.Builder()
.url("https://www.baidu.com")
.get()
.build();
// 3. OkHttpClient 对象 equest 请求=> Call 对象
Call call = okHttpClient.newCall(request);
//Call enqueue -- 异步执行Request
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// TODO Auto-generated method stub
System.out.println("line 61 coming");
System.out.println(response.body().string());
}});
System.out.println("我 先去玩啦!");
}
使用OkHttp模拟Charles 请求
每一个请求都代表一个网络接口,我们可以利用这些网络接口实现一些批量操作,比如爬虫.
模拟Charles请求的方法,还是拿小红书为例,随意点开一个请求,如图所示:
⚠️注意:Post请求中的参数ReqestBody的构造参数MeidaType要与Content-Type一致。上图的url可以使用Charles的直接拷贝过来,如下图: