待我年逾花甲,重新回到乡下。

池里养些鱼虾,坡上满是山茶。

不见雾霾黄沙,只有朝阳晚霞。

牛羊伴着鸡鸭,瓜田李下小麻。

孙儿承欢膝下,老伴陪与床榻。

纵是满口假牙,却也笑靥如花。

现在的移动端开发主要流行Hybrid开发方式,市面上也很多框架提供了前端访问手机硬件相关的API,但是总有不能满足的时候,所以,我们就自己做一个框架来封装提供给js的各种接口(框架不是本文重点),那么问题就来了,如何调试呢?前期开发可以通过打桩的方式来模拟,但是要发布上线必须要真枪实弹的调试通过才行。于是就输出了一个调试网页的DEMO(android/ios  app),只能是通过手动输入网页地址来查看界面效果和测试接口的正确性,虽然团队没得微信那么强大开发一个桌面调试工具,但这体验和效率也确实太差了。确实不能忍,所以就写了个小玩意儿来解决这个问题。

思路:通过socket 长连接的的方式,在PC控制台输入调试的网页地址,就能立马在手机上看到网页的效果。

看看效果截图:

要实现这个小玩意儿,需要一个简单的后端程序,代码如下:

package com.lixue;import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** * @author lh* @date 2016/12/12 11:30*/
public class AppServer {public static void main(String[] args) {new ServerThread().start();}
}class ServerThread extends Thread {boolean flag = false;ServerSocket ss;public void run() {try {ss = new ServerSocket(9999);// 创建服务器,并开放9999端口System.out.println("Server Listening on 9999...");flag = true;} catch (Exception e) {e.printStackTrace();}Socket sc = null;DataOutputStream outputStream = null;Scanner scanner = null;while (flag) {try {// 监听服务器端口,一旦有数据发送过来,那么就将数据封装成socket对象// 如果没有数据发送过来,那么这时处于线程阻塞状态,不会向下继续执行sc = ss.accept();System.out.println(sc.getInetAddress() + " connect...");outputStream = new DataOutputStream(sc.getOutputStream());outputStream.writeUTF("connect successful");scanner = new Scanner(System.in);while (true) {String line = scanner.nextLine();System.out.println("你输入的是:" + line);outputStream.writeUTF(line);}} catch (Exception e) {e.printStackTrace();} finally {try {if (outputStream != null) {outputStream.close();}if (sc != null) {sc.close();}} catch (IOException e) {e.printStackTrace();}}}}
}

Android端代码如下:

package com.lixue.debugwebapp;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
/*** @author lh* @version 1.0.0* @filename MainActivity* @description --------------------------------------------------------* @date 2016/12/12 12:00*/
public class MainActivity extends AppCompatActivity {public static final int CONNECT = 99;public static final int SUCCESS = 100;public static final int ERROR = 101;public static final String KEY_CONNECT = "connect";public static final String KEY_SUCCESS = "success";public static final String KEY_ERROR = "error";public static final String ADDRESS = "192.168.191.1";public static final int PORT = 9999;private TextView tv;private WebView webView;private StringBuilder sb = new StringBuilder();private SocketThread socketThread = null;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {String str = null;switch (msg.what) {case CONNECT:str = msg.getData().getString(KEY_CONNECT);tv.append("\n" + str);scrollToBottom();break;case SUCCESS:str = msg.getData().getString(KEY_SUCCESS);tv.append("\n" + str);scrollToBottom();if(isUrl(str)) {webView.loadUrl(str);}else{tv.append("\t\t\t不合法的url");}break;case ERROR:str = msg.getData().getString(KEY_ERROR);tv.append("\n" + str);scrollToBottom();break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();connect();}@Overrideprotected void onDestroy() {close();super.onDestroy();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if(webView.canGoBack()){webView.goBack();}else{finish();}return true;}private void init() {tv = (TextView) this.findViewById(R.id.tv_url);tv.setMovementMethod(ScrollingMovementMethod.getInstance());webView = (WebView) this.findViewById(R.id.wv);WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true);webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {webView.loadUrl(url);return true;}});}private void connect() {if (socketThread == null) {socketThread = new SocketThread(ADDRESS, PORT, handler);socketThread.start();tv.append("发起建立连接请求");tv.append("\n" + ADDRESS + ":" + PORT);scrollToBottom();}}private void close() {if (socketThread != null) {socketThread.closeThread();socketThread = null;}}/*** TV滚动到底部*/private void scrollToBottom() {int offset = tv.getLineCount() * tv.getLineHeight();if (offset > tv.getHeight()) {tv.scrollTo(0, offset - tv.getHeight());}}private class SocketThread extends Thread {private String address;//ipprivate int port;//port >1023private Handler handler;private DataInputStream in;private Socket socket;private boolean flag = false;public SocketThread(String address, int port, Handler handler) {this.address = address;this.port = port;this.handler = handler;}@Overridepublic void run() {try {socket = new Socket(address, port);in = new DataInputStream(socket.getInputStream());String content = in.readUTF();//连接成功发送消息sendMessage(KEY_CONNECT, content, CONNECT);while (!flag) {content = in.readUTF();//数据传输过程发送消息sendMessage(KEY_SUCCESS, content, SUCCESS);}} catch (IOException e) {e.printStackTrace();//发送异常消息sendMessage(KEY_ERROR, e.getMessage(), ERROR);} finally {try {if (in != null) {in.close();}if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}}}public void sendMessage(String key, String value, int code) {Bundle bundle = new Bundle();bundle.putString(key, value);Message message = handler.obtainMessage();message.what = code;message.setData(bundle);handler.sendMessage(message);}public void closeThread() {flag = true;}}/*** 简单的判断一下是否是网址,严谨性可以自行完善* @param str* @return*/public static boolean isUrl(String str) {boolean isUrl = false;if (str != null) {if (str.startsWith("http://") || str.startsWith("https://") || str.startsWith("ftp://")) {isUrl = true;}}return isUrl;}}

好了,整体比较简单,这只是一个简单的DEMO,但是也应该可以满足网页真机调试的需求了,另外Android的界面相关优化如IP/Port等配置可以自行实现,DEMO打印了相关地址跳转、以及连接错误和异常等信息,如果需要打印输出更多的功能信息,大家可以自行优化。

最后怕很多小白不知道怎么用,总结下使用方式:

第一步:把服务端程序AppServer跑起来;

第二步:把Android代码中的Socket地址改成你自己电脑的地址;要是觉得改来改去不方便,可以自己做一个Android端的IP/Port配置界面;

第三步:连接成功后,在后端控制台输入要调试的URL地址敲上回车就可以了。服务端我用的是Eclipse,你可以用任意的IDE或者命令行只要你喜欢!!!

第四步:经过上述操作,在手机端就能实时显示后端输入的网页了。

最后,再次说明这只是一个DEMO,纯属笔者无聊花了一小时写的,要是用着不安逸可以自己修改完善,比如Socket重连啊这些。如果要求很高可以用WebSocket,代码会更加简单,重连这些也都有实现。

Android代码地址:https://github.com/allmyson/DebugWebApp

完整附件地址:请点我。

WebApp网页真机调试工具-(Android)相关推荐

  1. vs使用android真机调试,UnityVS真机调试Android APP

    UnityVS真机调试Android APP 前提:完成UnityVS环境搭建.Unity Android环境搭建.Unity Android打包 步骤: 1. USB线连接手机和电脑,在手机的开发者 ...

  2. android编程用真机模拟,android编程的广播,模拟器可接受,但真机不可接受。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.动态注册 //接受广播 IntentFilter intentFilter = new IntentFilter(); intentFilter.ad ...

  3. as真机调试_如何使用真机调试android程序

    展开全部 第一步:将我们开发所用的Android真机的USB调试功能打开(打开方法为Settings(设置32313133353236313431303231363533e59b9ee7ad94313 ...

  4. android如何用真机测试,android studio如何使用真机测试app

    在使用android studio进行项目的调试的时候,模拟器真的有点慢,有时还很卡,大家可能还是更想使用真机进行调试,那么下面来看看android studio如何使用真机测试app的教程. 第一大 ...

  5. idea android 真机,intellij idea 设置用真机测试android

    android自带的模拟器是不容置疑的慢,genymontion虽然快,但是觉得有点怪的感觉,哈哈,其实这些都不是重点. 之前是用myeclipse开发android的,虽然一直很想用eclipse来 ...

  6. 关于coolpad8190Q连接计算机真机实测android程序

    我的手机是酷派8190Q,需要真机实测,就需要相应的usb驱动,在android adk网站中搜索OEM USB Drivers,在最下面就有相应android手机的驱动下载连接,我这里点击 Yulo ...

  7. HbuilderX中 真机调试 Android IOS

    文章目录 一.Android 二.IOS 2.1. 运行到IOS 2.2. 打开调试模式 一.Android HbuilderX中 Android 真机调试 二.IOS 2.1. 运行到IOS 2.2 ...

  8. 移动端html网页真机调试,Mac端调试iphone移动端网页

    0.前言 今天写好了一个页面,在mac上跑的好好的,结果手机打开直接白屏了.打开chrome的移动端模拟,但是模拟上也是好的,所以就只能开启真机调试了. 1.配置 在iOS设备上打开允许调试:设置→S ...

  9. 华为荣耀5C真机调试android过程遇到的问题

    1.电脑先下载豌豆荚,然后数据线连接,手机会自动提醒下载豌豆荚,下载完成后,打开,cmd中查看adb shell 我手机没有root,无法查看data/data数据,所以adb su,没有结果,之后我 ...

最新文章

  1. 北京国家新一代人工智能创新发展试验区正式成立
  2. poj 3321 Apple Trie
  3. 调整数组顺序使奇数位于偶数前面【不保持相对位置】
  4. php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
  5. 用java编写运行的小游戏_第一次用Java编写小游戏!
  6. 【笔记】windows10安装linux双系统教程(可能是现今最简单方法)
  7. How to upload windows Sysprep Files to VMware vCenter Server Appliance 6.5(vC
  8. 实用的网站***步骤
  9. Ionic2学习笔记
  10. 使用php函数防止SQL注入方法
  11. linux文件权限的设置命令
  12. 3D滚动控件实现抽奖效果
  13. 一套完整仿拉勾网HTML静态网页模板(含38个独立HTML)
  14. 全加器在计算机的应用,利用全加器构成3位并行加法器.doc
  15. PM也要学会每天反省
  16. 23位子网掩码是多少_子网掩码23位的是多少
  17. 赢在CSDN,我的CSDN成长之路,让子弹飞一会儿
  18. 《青春有你2》选手信息爬取
  19. window系统 安装 nvm 详细步骤
  20. 大学计算机实验教程制作电子小报,word使用教程:制作电子小报

热门文章

  1. 深度学习应用13电影评论情感分析
  2. [转](1条消息) 前端必知:针对高分辨率屏幕的样式优化(转载请删除括号里的内容)
  3. 异常:java.lang.LinkageError: loader constraint violation: when resolving interface method “javax.servl
  4. 学渣的刷题之旅 leetcode刷题 14.最长公共前缀
  5. 计算机毕业设计房地产客服管理系统xns程序
  6. 淘宝新店没有生意如何推广和引流呢
  7. 虚幻4command line 的注册
  8. 2017web前端校招面试总结 - 陌陌技术保障组
  9. java实习第一周周报,大学生实习周报
  10. hr面试性格测试30题_面试性格测试题60道