前言

对于逆向工程师,网络接口往往是我们首选的突破接口,逆向网络接口前,我们首先还是熟悉网络编程开发,直就是所谓的知“开” 知 “逆”,方能百“逆”不挫,今天就给大家分享我的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请求的方法,还是拿小红书为例,随意点开一个请求,如图所示:

Android网络开发软件 安卓网络开发_Android开发


⚠️注意:Post请求中的参数ReqestBody的构造参数MeidaType要与Content-Type一致。上图的url可以使用Charles的直接拷贝过来,如下图:

Android网络开发软件 安卓网络开发_网络编程_02