andserver - CSDN
  • AndServer初探

    千次阅读 2019-01-04 17:21:25
    AndServer初探 详细了解请戳这里 AndServer的github地址【https://github.com/yanzhenjie/AndServerAndServer文档地址【https://www.yanzhenjie.com/AndServer/】 AndServer的相关博客地址...

    AndServer初探

    详细了解请戳这里

    一度为快

    特殊的需求

    • 需求
      • 是否让Android应用成为一台服务器
    • 好处
      • 如果一个应用是Android应用,假设这时候需要外部有个服务来控制这台设备的某些内容或数据的传输,这时候如果用服务器来作为媒介和数据交换中心,不是不可以,这样做的话带来的问题是数据的延迟性和成本的代价;假设不通过第三方的服务器直接和Android应用直接通讯,这样不仅可以减少数据传输中时间,还可以减少开发的复杂度,最终的目的是尽可能快的进行数据的交换,完成两个应用的交互
    • Android上使用什么来完成Http服务器
      • ApacheHttpCore是一个优秀的Http底层框架,支持构建服务器,也支持构建客户端(有的Android版本弃用了ApacheHttpClient相关的API,用的话记得进行引用)

    AndServer是什么

    • AndServer是Android平台的Web Server和Web FrameWork,它基于编译时注解提供了类似Spring注解和功能,通过给类和方法加上合适的注解,使得这些方法可以以接口的形式暴露给http请求者。

    AndServer的特性

    • 使用注解开发接口
    • 全局使用请求拦截器,可以使用注解,全局多个
    • 全局异常处理器,可以使用注解,全局唯一
    • 全局消息转换器,可以使用注解,全局唯一

    AndServer的架构

    • Linux Kernel(linux核心) -> Socket(长连接) -> HttpParser(Http解析) -> FrameWork(框架) -> Handler(处理机)

    Android的应用架构

    • Dispatcher(分发器) -> Interceptor(拦截器) -> HanderAdapter(处理适配器) -> Handler(处理机) -> ViewReslover(视图解析器)

    注解

    注解 用途
    Controller 控制器,给类进行注解

    如果需要要返回指定的页面,则需要Controller配合视图解析器InternalResourceViewResolver才行,如果需要返回json、xml或自定义mediaType内容到页面,则需要在对应的方法上加@ResponseBody注解
    RestController 控制器,给类进行注解

    RestController注解相当于是@Controller+@ResponseBody注解的结合

    如果只使用RestController注解,则该类的方法中无法返回jsp页面(或者是html),配置视图解析器InternalResourceViewResolver不起作用,返回的内容就是return的内容
    RequestMapping 可以用在类上,也可以用在方法上

    注意:使用时所在类必须有Controller或者是RestController方法才有意义

    RequestMapping可以规定接口的请求路径、请求方法、参数校验、请求头校验、Accept和ContentType等重要规则
    RequestParam 只能用在方法参数上,用来获取客户端传来的参数
    PathVariable 只能用在方法参数上,用来获取客户端的path参数
    QueryParam 只能用在方法参数上,不支持MultipartFile,仅用来获取Url中的参数
    FormPart 只能用在方法参数上,仅用在获取Form中的参数
    ResponseBody 注解ResponseBody使用在Controller注解类下的方法上,相当于使用了注解RestController给类一样,直接将返回值作为响应发送给客户端
    RequestBody 客户端可以把一段json或者一个文本整体写到请求的Body中发送给服务端,服务端的处理方式有两种,第一种是拿到RequestBody对象,由开 发者自行转换为目标对象,第二种是使用RequestBody注解结合MessageConverter自动转化为目标对象
    CookieValue 方便获取客户端提交的Cookie的值
    RequestHeader 方便获取客户端的Header值
    Addition 用在方法上,增加一些额外的信息,方便在HandlerInterceptor(拦截器)中处理一些业务,例如标记方法登录后才可以访问@Addition(“needlogin”)
    Interceptor Interceptor是拦截器的意思标记某个类是HandlerIntercept的子类,并且作为拦截器参与;可以添加多个类,所有添加了Interceptor注解的类都将参与程序运行
    Converter Converter是转换器的意思,标记某个类是MessageConverter的子类,并作为消息转换器参与;可以添加多个类,但是只有其中一个参与运行,先扫描到哪个就先执行哪个,因此最好是一个类添加Converter注解
    Resolver Resolver是解决者的意思,用来标记某个类是ExceptionResolver的子类,并作为异常解决者参与;Resolver可以添加多个类,但是只有其中一个添加了Resolver注解类参与程序运行,看哪个先被扫描到就先执行哪个,建议只添加一个Resolver注解
    WebSite 用来标记某个类是WebSite的子类,并作为静态网站参与;WebSite可以注解多个类,所有添加了WebSite注解的类都将参与程序的运行

    类和接口

    名称 用途
    MultipartFile 表示客户端表单中上传的文件
    MessageConverter MessageConverter需要结合Converter注解进行使用,首先要一个类实现MessageConverter接口,然后在该类上加上Converter注解即可使用,不需要其它的配置
    HandlerInterceptor 用来拦截客户端对服务端所有的接口的请求,如果是不存在的接口HandlerInterceptor是不会进行处理的,HandlerInterceptor需要结合Interceptor注解使用,首先一个类实现HandlerIterator接口,然后在该类上加上Interceptor注解即可使用,不需要其它配置
    ExceptionResolver 用来处理发生的异常,默认情况下会输出异常到Message到客户端,ExceptionResolver需要结合Resolver注解使用,首先要一个类实现ExceptionResolver接口,然后在该类上加上Resolver注解即可使用,不需要其它的配置
    ResponseBody ResponseBody是响应包,Controller和RestController中的方法返回值最终都会被转化为ResponseBody发送
    RequestBody 客户端可以把一段json或者一个文件整体写到请求的Body中发送给服务端,服务端处理的方式有两种,第一种是使用RequestBody自动转化为目标对象,第二种拿到RequestBody,由开发者转化为目标对象;因此RequestBody最终呈现的形式是通过流,所以客户端可以把任何内容放到RequestBody的请求包中发送到服务器端,服务端可以把RequestBody再转为任何自己想要的数据类型
    Cookie Cookie可以用来辨别用户的身份,一般会加密后发送给客户端,客户端会保存在磁盘上
    Addition Addition类的属性对应的是Addition注解的参数;它和Interceptor配合来进行使用

    网站

    名称 用途
    AssetsWebsite Website需要结合Website注解使用,首先需要一个类继承Website类,然后在该类上加上Website注解即可使用,不需要其他配置
    StorageWebsite Website需要结合Website注解使用,首先需要一个类继承Website类,然后在该类上加上Website注解即可使用,不需要其他配置
    FileBrowser FileBrowser可以以列表的形式展开开发者指定目录的文件和目录,并可以点击下载列表中的文件和查看列表中的目录和内容

    缓存

    名称 用途
    ETag 被添加了Controller注解或者RestController注解的类实现
    LastModified 被添加了Controller注解或者RestController注解的类实现。
    展开全文
  • AndServer,一个Android端的web服务器

    万次阅读 多人点赞 2017-05-13 15:33:37
    AndServer是一个Android端的Web服务器,类似Apache或者Tomcat,它是一个普通的Android Library,Android项目Gradle远程依赖或者添加Jar包皆可引入即可进行开发。

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

    Features Image

    大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目——AndServer

    开源地址:https://github.com/yanzhenjie/AndServer

    AndServer是一个Android端的Web服务器,类似Apache或者Tomcat,但又有不同,它是一个普通的Android Library,Android项目Gradle远程依赖或者添加Jar包皆可引入该项目,然后就通过正常Android开发一样开发App了。

    AndServer是用纯Android API写一个库,所以不用任何第三方的库或者什么硬件编译,打成Jar包后仅仅580kb。

    很多人看到这里就有疑问了:它的使用场景是什么?按照国际惯例,我举个栗子:

    某公司公开了一款TV APP,可以安装在电视或者盒子上,有一个功能是这样的:
    APP安装在电视上打开后,会生成一个唯一ID,用户用微信扫码通过公司提供的公众号和该电视上的该APP绑定,用户通过公众号打开一个H5页面,这个页面可以上传图片或者视频到服务器,服务器检测到该用户和某个屏幕的APP绑定,动态把用户发送的图片或者视频发送到电视播放。
    这样一个功能是很好的体验,但是耗费服务器资源、远端上传、远端下载也都需要时间,还不如我直接用U盘拷贝到电视呢。那么如果我通过网页在局域网直接把视频或者图片发送到电视上的APP播放,岂不是更加直接快捷?

    当然大部分同学可能很少接触到APP之间互相在局域网通信、局域网上传下载、局域网登录这样的需求,还有很多栗子我就不举了,下面开始正式安利。


    特点

    1. 接受客户端文件上传、下载文件。
    2. 动态Http API,就像Java的Servlet一样写接口。
    3. 部署静态网站,例如纯Html,支持JS、CSS、Image分离。
    4. 部署动态网站,例如Html表单,当然可以结合上面的Android Http接口。

    基本上和Java的Servlet一样的功能,如果你做过Java开发或者其它语言的Web开发应该就很熟悉了。

    依赖

    • Gradle
    compile 'com.yanzhenjie:andserver:1.0.2'
    • Maven
    <dependency>
      <groupId>com.yanzhenjie</groupId>
      <artifactId>andserver</artifactId>
      <version>1.0.2</version>
      <type>pom</type>
    </dependency>
    • ADT,可以去AndServer主页下载Jar包。

    使用方法

    最好的教程是sample,建议到AndServer主页下载sample运行查看效果,然后结合README就更加清晰了。

    创建服务器

    AndServer andServer = new AndServer.Build()
        ...
        .build();
    
    // 创建服务器。
    Server mServer = andServer.createServer();
    ...
    
    // 启动服务器。
    mServer.start();
    ...
    
    // 停止服务器。
    mServer.stop();
    ...
    
    // 服务器正在运行吗?
    boolean running = mServer.isRunning();

    端口号和响应超时设置

    AndServer andServer = new AndServer.Build()
        .port(8080) // 默认是8080,Android平台允许的端口号都可以。
        .timeout(10 * 1000) // 默认10 * 1000毫秒。
        ...
        .build();
    ...

    部署网站

    部署网站是通过Website接口,你也可以自己实现这个接口,当然AndServer已经提供了两个默认实现:

    如果用上面两个实现注册你的网站,那么你的默认首页(index.html)是:

    http://ip:port/
    http://ip:port/youPath
    http://ip:port/youPath/index.html

    注册网站到AndServer

    Wesite wesite = new AssetsWebsite(AssetManager, youPath);
    // 或者
    Wesite wesite = new StorageWebsite(youPath);
    
    AndServer andServer = new AndServer.Build()
        ...
        .website(wesite);
        .build();

    AssetsWebsite的使用

    如果你的网站在assets下,那么你就用AssetsWebsite来部署你的网站。

    使用方法是:

    //AssetManager不能被关闭。
    AssetManager mAssetManager = getAssets();
    
    Wesite wesite = new AssetsWebsite(mAssetManager, youPath);

    上面我们看到new AssetsWebsite时需要传一个AssetManager和一个path,path支持assets根目录和子目录,下面是这两种情况的举例。

    • 如果你的网站在assets根目录下, 你的path就填"",比如:

    Assets根目录

    Wesite wesite = new AssetsWebsite(mAssetManager, "");

    那么你的默认首页访问地址就是:

    http://ip:port
    http://ip:port/index.html

    那么你的其它页面访问地址是:

    http://ip:port/login.html
    http://ip:port/error.html

    比如:

    http://192.168.1.12:8080/index.html  
    http://192.168.1.12:8080/login.html
    • 如果你的网站根目录在assets的子目录下,那么你传入assets的相对目录地址就好了比如你的网站在assetsweb目录,例如:

    Assets子目录

    Wesite wesite = new AssetsWebsite(mAssetManager, "web");

    那么你的默认首页访问地址就是:

    http://ip:port
    http://ip:port/web
    http://ip:port/web/index.html

    那么你的其它页面访问地址是:

    http://ip:port/web/login.html 
    http://ip:port/web/error.html

    例如:

    http://192.168.1.12:8080/
    http://192.168.1.12:8080/index.html
    http://192.168.1.12:8080/web/index.html
    http://192.168.1.12:8080/web/index.html  
    http://192.168.1.12:8080/web/login.html

    StorageWebsite的使用

    如果你的网站在内存设备下,只要以文件的形式可以读取到,那么你就用StorageWebsite来部署你的网站,比如你的网站在SD卡下时。

    使用方法是:

    Wesite wesite = new StorageWebsite(youPath);

    它很简单,只要传入你的网站的存储目录地址即可,例如你的网站在SD卡下的www目录:

    File file = new File(Environment.getExternalStorageDirectory(), "www");
    String websiteDirectory = file.getAbsolutePath();
    
    Wesite wesite = new StorageWebsite(websiteDirectory);

    访问地址和AssetsWebsite的道理相同。

    像Servlet一样写Http接口

    Http API是通过RequestHandler接口来注册的,它是一个java interface,它和JavaServlet一样。

    你需要实现这个接口,然后在AndServer注册即可,例如:

    public class RequestLoginHandler implements RequestHandler {
    
        @Override
        public void handle(HttpRequest req, HttpResponse res, HttpContext con) {
            Map<String, String> params = HttpRequestParser.parse(request);
    
            // Request params.        
            String userName = params.get("username");
            String password = params.get("password");
    
            if ("123".equals(userName) && "123".equals(password)) {
                StringEntity stringEntity = new StringEntity("Login Succeed", "utf-8");
                response.setEntity(stringEntity);
            } else {
                StringEntity stringEntity = new StringEntity("Login Failed", "utf-8");
                response.setEntity(stringEntity);
            }
        }
    }

    然后在AndServer中注册:

    AndServer andServer = new AndServer.Build()
        ...
        .registerHandler("login", new RequestLoginHandler())
        .build();

    现在你就得到了一个唯一的访问地址:http://ip:port/login, 例如:

    http://192.168.1.12:8080/login?username=123&password=123

    文件下载和文件上传的例子请下载sample查看。

    提交Html表单到Android端

    Htmlformaction中填入你注册RequestHandler时的key就可以了,然后在RequestHandler

    handle(HttpRequest, HttpResponse, HttpContext)

    方法就可以获取form提交的参数了。

    比如我们上面注册Login RequestHandlerform中这样使用:

    <form id="form1" method="post" action="login">
    ...
    </form>

    监听服务器的状态

    服务器一般情况下有三种状态:成功启动、启动时失败、成功停止服务器,失败时会返回一个异常,一般情况下是网络问题或者端口被占用。

    private Server.Listener mListener = new Server.Listener() {
        @Override
        public void onStarted() {
            // 服务器启动成功.
        }
    
        @Override
        public void onStopped() {
            // 服务器停止了,一般是开发者调用server.stop()才会停止。
        }
    
        @Override
        public void onError(Exception e) {
            // 服务器启动发生错误,一般是端口被占用。
        }
    };
    
    AndServer andServer = new AndServer.Build()
        ...
        .listener(mListener)
        .build();

    如果你觉得还不错,请关注我的微信公众号吧
    严振杰


    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

    展开全文
  • AndServer搭建服务的用法

    千次阅读 2020-04-04 22:23:22
    0x00 需求 搭建一个加密的服务:其他APK的加密服务即与其通讯。 ...andserver搭建方法: 1.搭建本地server import android.conten...

    0x00 需求

    搭建一个加密的服务:其他APK的加密服务与其通讯。
    https://github.com/yancy2430/MyApplication/blob/master/app/src/main/java/com/tdeado/myapplication/MainActivity.java

    andserver搭建方法:

    1.搭建本地server

    import android.content.Context;
    import android.util.Log;
    
    import com.yanzhenjie.andserver.AndServer;
    import com.yanzhenjie.andserver.Server;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.concurrent.TimeUnit;
    
    public class ServerManager {
        private static final String TAG = "ServerManager";
    
        private Server mServer;
    
        /**
         * Create server.
         */
        public ServerManager(Context context) {
            InetAddress inetAddress = null;
            try {
                inetAddress = InetAddress.getByName(NetWorkUtil.getHostIp());
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    
            mServer = AndServer.serverBuilder(context)
                .inetAddress(inetAddress)
                .port(8080)
                .timeout(10, TimeUnit.SECONDS)
                .listener(new Server.ServerListener() {
                    @Override
                    public void onStarted() {
                        // TODO The server started successfully.
                        Log.d(TAG, "onStarted: ");
                    }
    
                    @Override
                    public void onStopped() {
                        // TODO The server has stopped.
                        Log.d(TAG, "onStarted: ");
                    }
    
                    @Override
                    public void onException(Exception e) {
                        Log.e(TAG, "onException: ",e );
                        // TODO An exception occurred while the server was starting.
                    }
                })
                .build();
        }
    
        /**
         * Start server.
         */
        public void startServer() {
            if (mServer.isRunning()) {
                // TODO The server is already up.
            } else {
                mServer.startup();
            }
        }
    
        /**
         * Stop server.
         */
        public void stopServer() {
            if (mServer.isRunning()) {
                mServer.shutdown();
            } else {
                Log.w("AndServer", "The server has not started yet.");
            }
        }
    }
    
    

    2.启动本地server

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            serverManager = new ServerManager(this);
            serverManager.startServer();
            Button button = findViewById(R.id.ip);
            button.setText(NetWorkUtil.getHostIp()+":8080");
        }
    

    3.服务的接口设置

    import com.duapp.aesjni.AESEncrypt;
    import com.nice.main.helpers.utils.NiceSignUtils;
    import com.yanzhenjie.andserver.annotation.GetMapping;
    import com.yanzhenjie.andserver.annotation.PostMapping;
    import com.yanzhenjie.andserver.annotation.RequestMapping;
    import com.yanzhenjie.andserver.annotation.RequestParam;
    import com.yanzhenjie.andserver.annotation.RestController;
    
    
    
    @RestController
    @RequestMapping("/encrypt")
    public class Controller {
        private static final String TAG = "Controller";
        @PostMapping("/du")
        public String du(@RequestParam("str") String str) {
            String key = AESEncrypt.encode(this, str);
            return key;
        }
        @GetMapping("/mdu")
        public String mdu() {
            String key = "welcome";
            return key;
    
        }
        @PostMapping("/nice")
        public String nice(@RequestParam("str1") String str1,@RequestParam("str2") String str2,@RequestParam("str3") String str3,@RequestParam("str4") String str4) {
            String[] sts = NiceSignUtils.encode(str1, str2.getBytes(),str3.getBytes(), str4.getBytes());
            return sts[2].replace(str1,str2);
        }
    }
    

    使用方法:

    1. 安装加密的 apk,并且将端口转发到8080.

    adb install encrypt.apk
    adb forward tcp:8080 tcp:8080
    将PC上所有8080端口通信数据将被重定向到手机端8080端口server上

    1. 在PC上发出post 请求,假设参数为str。

    curl -H ‘Accept-Language: zh-cn’ --data “str=AAAAAAAAAAAAAAAAA” --compressed ‘http://192.168.1.149:8080/encrypt/du’

    1. 获得返回值
      dopYyQm9/rBs459gq/u5SjVmv2HsYSJLtU5WzAz3df04IxYNjZJr3bBRQTaTWiZR

    进阶的使用方法:

    Xposed+Sekiro简单实现抖音搜索结果获取

    https://github.com/h1code2/douyin_search_result

    • step1: 使用Sekiro注册xpc的服务
    public class HookMain implements IXposedHookLoadPackage {
        public static XC_LoadPackage.LoadPackageParam loadPackageParam = null;
    
        @Override
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
            if (lpparam.packageName.equals("com.ss.android.ugc.aweme.lite")) {
                HookMain.loadPackageParam = lpparam;
                try {
    
                    // 在com.ss.android.ugc.aweme.splash.SplashActivity -> onCreate 注入服务
    
                    XposedHelpers.findAndHookMethod("com.ss.android.ugc.aweme.splash.SplashActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            final SekiroClient sekiroClient = SekiroClient.start("sekiro.virjar.com", "client-6", "group-6");
                            sekiroClient.registerHandler("dy_search", new DouYinUserSearchHandler());
                            XposedBridge.log("=========== sekiro服务启动成功 ===========");
                        }
                    });
                } catch (Exception e) {
                    XposedBridge.log("=========== Sekiro服务启动失败 ===========");
                }
            }
        }
    }
    
    
    • step2: Sekiro方法调用的处理逻辑
    public class DouYinUserSearchHandler implements SekiroRequestHandler {
    
    
        @Override
        public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
            Gson gson = new Gson();
    
            String query = sekiroRequest.getString("query");
            String start = sekiroRequest.getString("start", "0");
            String count = sekiroRequest.getString("count", "10");
    
            long param2 = Long.parseLong(start);
            int param3 = Integer.parseInt(count);
    
            if (query == null || query.equals("")) {
                sekiroResponse.send("请传入必需参数:query");
            }
    
            Class<?> SearchApi = XposedHelpers.findClass("com.ss.android.ugc.aweme.discover.api.SearchApi", HookMain.loadPackageParam.classLoader);
            Object object = XposedHelpers.callStaticMethod(SearchApi, "a", query, param2, param3);
            Log.d("object",object.toString());
            Log.d("gson",gson.toJson(object));
            sekiroResponse.send(gson.toJson(object));
        }
    }
    
    • step3: demo测试案例

    adb forward tcp:8080 tcp:8080

    curl 'http://sekiro.virjar.com/invoke?group=group-6&action=dy_search&query=%E5%8F%AF%E7%88%B1%E7%9A%84%E4%BA%BA' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Mobile Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' --compressed --insecure
    

    同时:也可以使用frida_rpc 做调用
    https://github.com/h1code2/douyin_search

    展开全文
  • andserver-1.1.4.jar

    2020-07-29 14:19:38
    andserver-1.1.4.jar
  • AndServer-master源码

    2020-07-30 23:31:54
    AndServer-master源码,是一个很不错的Android源码,有兴趣的伙伴们抽时间可以看一下把。
  • Android上的Server——AndServer的使用

    千次阅读 2019-07-05 15:07:48
    在项目的开发中,有以下场景: Android板A,AndroidB。 A上需要搭建一个本地服务,B向A请求,A将信息反馈于B。实际上是为了配合第三方的Android板,来进行开发。 或者一个更熟悉类似的场景,在与路由器连接至同一...

    在项目的开发中,有以下场景:

    Android板A,AndroidB。

    A上需要搭建一个本地服务,B向A请求,A将信息反馈于B。实际上是为了配合第三方的Android板,来进行开发。

    或者一个更熟悉类似的场景,在与路由器连接至同一个局域网内后,我们访问192.168.1.1,就可以进入路由器的控制页面了。

    同理,在我们的项目中有如此需求,你可以做一个可视的(展示页面),或者直接起一个服务提供接口。

    在此场景中,如何搭建服务便是一个头疼的概念。

    引入了AndServer这个框架,可参考GitHub上

    如何使用?请参考:

     

    添加依赖:

    dependencies {
        implementation 'com.yanzhenjie.andserver:api:2.0.1'
        annotationProcessor 'com.yanzhenjie.andserver:processor:2.0.1'
    }

    其原理也是应用到了socket,有时间的话可以看一下官方的:https://www.yanzhenjie.com/AndServer/

     

    展开全文
  • 使用AndServer在Android上搭建Web服务器

    万次阅读 2017-04-10 17:12:58
    AndServer是一个Android的Web服务器, 支持部署动态网站和静态网站, 支持写Http接口,和Java的Servlet一样。 特点:  部署动态网站。  部署静态网站。 动态Http API,就是我们通常说的服务器接口。 接受客户端文件...
  • (4.2.47)AndServer手机服务器

    千次阅读 2018-04-26 19:46:39
    一、概述 ...3.1 AndServer 3.2 Server 3.3 Core 3.3.1 持有变量 3.3.2 启动 3.3.3 停止与判断 3.4 DispatchRequestHandler请求分发器 3.4.1 持有变量 3.4.2 核心分发功能 四、RequestHandle...
  • 问题现象 HDFS Client访问Server出现...Caused by: javax.security.sasl.SaslException: No common protection layer between client and server at com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHands
  • 在Ubuntu14.04上正确安装的Docker和Fig后,Docker可以正常使用,但是在使用Fig的时候出现下面的错误client and server don't have same version (client : 1.12, server: 1.10)此时是由于Docker的版本有问题,解决...
  • #问题:打开mongo shell 时出现如下错误(以为没有问题) 测试时导致 show collections 命令使用不了 ...通过网络上一番查询,了解了是由于安装mongodb时,没有关闭之前mongodb server,因此需要通过...
  • 出现上述问题时候在server中无法加载tomcat 解决办法如下 你先要配置tomcat运行环境,才能在创建server时使用。
  • 在Ubuntu14.04上正确安装的Docker和Fig后,Docker...client and server don't have same version (client : 1.12, server: 1.10)  此时是由于Docker的版本有问题,解决办法是更新升级系统,然后
  • 原因: 此问题产生原因为项目的.net framework版本和服务器安装的.net 版本不一致导致Web Service客户端使用的TLS 版本与服务端使用的TLS 版本不同,所以接口连接失败,只有ASP.NET 4.5及以上才能运行TLS 1.1或TLS ...
  • 今天来讲一讲jmeter的压测环境准备。 我们知道进行压测其实就是模拟多并发请求给服务器,然后通过一些性能指标来综合评估服务器所能承受的压力。 在去jmeter官网下载客户端后,是已经自带有压力测试的相关组件的...
  • Anroid搭建一个局域网Web服务器

    万次阅读 多人点赞 2017-03-20 13:17:50
    这几天有人问我局域网Client和Client通信的时候有时候用什么技术比较好,其实我想到的是Socket和Http,我们知道Http是基于Socket的,所以它是一个非常成熟的Socket,所以我选择了用Http来实现,今天的博客内容也是...
  • Character set conversion is not available between client character set 'iso_1' and server character set 'cp936'.
  • AndroidStuio快速发布开源项目到Jcenter/Bintray

    万次阅读 多人点赞 2017-02-07 16:19:46
    AndroidStuio快速发布开源项目到Jcenter/Bintray ...前言 最近做了两个开源项目,一个是Android网络框架NoHttp,和Volley、OkHttp一样做客户端请求的,更多相关信息请...另一个是Android Web服务器框架AndServer,用来在
  • HTTP:HTTP的server and client详细攻略

    千次阅读 2020-07-19 15:57:08
    HTTP:HTTP的server and client详细攻略 目录 设计思路 HTTP的server and client术语解释 设计思路 HTTP的server and client术语解释 1、服务器端指response,就好比sina、163、sohu。 2、...
  • 原文:... Introduction ...In the first article of this series, we explored a client-server model with an authoritative server and dumb clients that just send i
1 2 3 4 5 ... 20
收藏数 1,024,022
精华内容 409,608
热门标签
关键字:

andserver