配置 golang 开发环境

安装并初始化 gomobile

go get golang.org/x/mobile/cmd/gomobile
gomobile init

创建 beego 项目, 参考 https://beego.me/quickstart

cd $GOPATH/src
bee new androidweb
# 创建 gomobile 文件
cd androidweb
mkdir androidweb
gedit androidweb.go

androidweb.go 的内容

package androidweb

import (
"androidweb/controllers"
_ "androidweb/routers" "github.com/astaxie/beego"
) func Run(dir string) {
beego.Router("/", &controllers.MainController{})
beego.LoadAppConfig("ini", dir+"/conf/app.conf")
beego.SetStaticPath("/static", dir+"/static")
beego.BConfig.WebConfig.ViewsPath = dir + "/views"
beego.Run()
}

生成 aar,

cd $GOPATH/src
gomobile bind -target=android androidweb/androidweb/

成功的话,会在 $GOPATH/src 目录下创建一个 androidweb.aar 文件

创建 android 项目,并添加权限

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

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

将 beego 项目中的 conf static views 复制到 android 项目的 assets 中

导入前面生成的 androidweb.aar 文件

修改 MainActivity

import android.content.Context;
import android.content.res.AssetManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView; import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream; import androidweb.Androidweb; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView) findViewById(R.id.textView)).setText("启动成功..." + "\n" +
"IP: " + getIpAddress() + "\n" +
appConf()); copyFolder("conf");
copyFolder("static");
copyFolder("views"); new Thread() {
@Override
public void run() {
super.run();
Androidweb.run(getFilesDir().getAbsolutePath());
}
}.start();
} private String appConf() {
BufferedReader reader = null;
StringBuilder sb = new StringBuilder();
try {
reader = new BufferedReader(new InputStreamReader(getAssets().open("conf/app.conf")));
// do reading, usually loop until end of file reading
String mLine;
while ((mLine = reader.readLine()) != null) {
//process line
sb.append(mLine + "\n");
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
return sb.toString();
} private String getIpAddress() {
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wm.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
WifiInfo info = wm.getConnectionInfo();
int hostip = info.getIpAddress();
String ip = (hostip & 0xFF) + "." + ((hostip >> 8) & 0xFF) + "." + ((hostip >> 16) & 0xFF) + "." + ((hostip >> 24) & 0xFF);
return ip;
}
return null;
} private void copyFolder(String path) {
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null; File dir = new File(getFilesDir() + "/" + path);
if (!dir.exists()) {
dir.mkdirs();
}
try {
String[] files = assetManager.list(path);
for (String filename : files) {
in = assetManager.open(path + "/" + filename);
File outFile = new File(dir, filename);
out = new FileOutputStream(outFile);
copyFile(in, out);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
}

启动 android 程序即可

本文来自:开源中国博客

把 android 手机变成 web server (golang)的更多相关文章

  1. Android手机用KSWEB搭建Web服务器成功安装WordPress

    之前部落分享的几个免费Web服务器软件都是用来安装在本地电脑上,搭建Apache.PhpMyAdmin.MySQL等网站运行环境,然后我们就可以在电脑上测试运行Wordpress.Discuz! 论坛 ...

  2. Creating A Simple Web Server With Golang

    原文:https://tutorialedge.net/post/golang/creating-simple-web-server-with-golang/ -------------------- ...

  3. Android手机流量分析工具介绍

    一.20 Best Android Hacking Apps And Tools Of 2018 首先罗列常见的Android手机hacking的工具 #1The Android Network Ha ...

  4. Fiddler抓取Android手机网络数据包

    也许你也有疑问,如果开发没有完备的接口文档,我如何知道他API的信息? 这时我们就得通过一些抓包工具抓取这些API信息. 常见抓包工具 HTTP抓包工具:Fiddler.Charles.Firebug ...

  5. Pyqt adb 获取Android手机屏幕

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...

  6. Android手机浏览器访问本地网络相关问题

    为了测试开发的手机网站,常常需要使手机直接访问本地网络. 在这个过程中碰到几个问题,记下来供以后参考 1. 在本地主机运行apache后,使用localhost和127.0.0.1可以访问页面,但使用 ...

  7. 使用Android应用调用Web Service

    Java本身提供了丰富的Web  Service支持,比如Sun公司指定的JAX-WS  2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ...

  8. mac 下真机调试 android 手机

    第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): Spreadtru ...

  9. 手机H5 web调试利器——WEINRE (WEb INspector REmote)

    手机H5 web调试利器--WEINRE (WEb INspector REmote) 调试移动端页面,优先选择使用chrome浏览器调试,如果是hybrid形式的页面,可以使用chrome提供的ch ...

随机推荐

  1. 120. 单词接龙 (BFS)

    描述 给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列 比如: 每次只能改变一个字母. 变换过程中的中间单词必须在字典中出现. 如果没有转换序列则返回0. 所有单词 ...

  2. WIndows下使用Grafana+InfluxDB打造监控系统

     前言 对于一个运维DBA来说,了解数据库的TPS.QPS很有必要(QPS:每秒查询数,即对数据库每秒的DML的操作数:TPS:每秒事物处理,即对数据库每秒DDL操作数),通过了解他们,可以掌握一个实 ...

  3. C# Note20: 制作延时改变显示的标题栏

    前言 在使用wpf构建一个窗体时,其中有这样一个功能,在保存数据或加载数据时,我们希望在改变标题栏的显示以标志当前保存成功的状态或者加载数据的名称信息,而且标题信息更新显示几秒后,再恢复到默认的状态. ...

  4. java中去除字符串(String)中的换行字符(\r \n \t)

    例1: public class Test { public static void main(String[] args) { String s = "'sds gdasda" ...

  5. 关于解决Missing Number之类的算法问题

    停止刷题已经三周了,有些想念.最近总算完成了公司代码的重构,于是要继续开始学习算法. 先来看leetcode上面第268题: Given an array containing n distinct ...

  6. oracle ceil函数

    ceil和floor函数在一些业务数据的时候,有时还是很有用的. ceil(n) 取大于等于数值n的最小整数: floor(n)取小于等于数值n的最大整数 如下例子 SQL> select ce ...

  7. H5 history.pushState 在微信内修改url后点击用safari打开/复制链接是修改之前的页面

    解决方案:url参数增加随机参数 function wxRefresh() { var replaceQueryParam = (param, newval, search) => { var ...

  8. Linux 集锦(持续更新中)

    // 获取文件夹下的代码总行数 find . -name "*.*" | xargs wc -l // ls 排序 ls -lt 按照最后修改时间降序 ls -lrt 按照时间升序 ...

  9. python数学库math模块

    函数 数学表示 含义 .pi 圆周率π π的近似值,15位小数 .e 自然常数 e e的近似值,15位小数 ceil(x) [x] 对浮点数向上取整 floor(x) [x] 对浮点数向下取整 pow ...

  10. python成长之路二

    python的print格式化输出,以及使用format来控制. 1,打印字符串(str),利用%s. >>> print ('My name is %s' % ('TaoXiao' ...