Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法

一直都是通过OkHttp远程服务端进行数据交互,突发奇想能不能也通过OkHttp在局域网的情况下对两个安卓设备或者手机进行数据交互呢?

这样一方安卓设备要当做服务端与另一个安卓设备通过OkHttp进行数据交互即可

当然还可以通过 socket 和 ServerSocket 通过发送TCP 实现两个安卓设备的数据交互

Android之间互传消息之ServerSocket,Android服务端接收Socket发送的TCP

省流—> 以下代码借鉴以下链接

AndServer配置
【Android】 使用AndServer框架在手机上搭建服务器
AndServer文档地址

首先是Java版本的,亲测可运行

网上大多数我都看过了,基本都是有问题的,可能别人或其他楼主可以运行,但是到我这里不行,大概是他们的AS版本太久远了~~~

第一步,先看一下我的目录结构,需要改动的地方我都标出来了,原理,怎么实现的我也没研究源码,作为一个白嫖客,我拿过来能正常使用我就笑了,嘤嘤嘤。

在这里插入图片描述

由上到下,网络权限必不可少

在这里插入图片描述

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

MainActivity,布局文件就俩Button,你都开始研究Server了,不会还想连俩按钮的xml都想白嫖吧????

在这里插入图片描述

public class MainActivity extends AppCompatActivity {

    private Button button1,button2;
    private ServerManager serverManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = findViewById(R.id.button_start);
        button2 = findViewById(R.id.button_stop);
        serverManager = new ServerManager(this);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                serverManager.startServer();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                serverManager.stopServer();
            }
        });
    }
}

ServerManager

在这里插入图片描述

public class ServerManager {

    private Server mServer;
    private static final String TAG = "ServerManager";

    /**
     * Create server.
     */
    public ServerManager(Context context) {
        InetAddress inetAddress = null;
        try {
            //这里的ip地址是手机的ip地址,可通过手机设置>系统->关于手机查看
            inetAddress = InetAddress.getByName("192.1.1.1");
        } 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() {
                        Log.i(TAG, "onStarted: 服务器启动");

                    }

                    @Override
                    public void onStopped() {

                        Log.i(TAG, "onStopped: 服务器关闭");
                    }

                    @Override
                    public void onException(Exception e) {

                        Log.i(TAG, "onException: 服务器出现异常"+e.getMessage());
                    }
                })
                .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.");
        }
    }
}

UserController,有几篇文章,使用这里面的注解的时候,提示找不到对应的注解,那是他们博主使用的版本太老了,更新最新的版本试下哈

在这里插入图片描述

@RestController
public class UserController {

    @GetMapping("/123")
    String login() {
        Log.i(TAG, "login: 收到消息");
        return "你好啊兄弟";
    }
}

以上就是代码,以下是配置文件,跟紧了,快上车!!!!

一开始这里没添加,编译没问题,一直卡在运行了,错误日志里也提示了,就是搞不懂,谁能想到还得加一这块啊,如果你的AS版本这里不是 plugins-id 的形式的而是 classpath 的形式,往下分,看一下 Kotlin 写法的配置去~

在这里插入图片描述

buildscript {
    repositories {
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.yanzhenjie.andserver:plugin:2.1.9' // AndServer
    }
}
plugins {
    id 'com.android.application' version '7.4.2' apply false
    id 'com.android.library' version '7.4.2' apply false
}

有一说一,咱虽然不知道这咋写的,小配件还整挺多
在这里插入图片描述
在这里插入图片描述

    id 'com.yanzhenjie.andserver' // AndServer
    implementation 'com.yanzhenjie.andserver:api:2.1.12'
    annotationProcessor 'com.yanzhenjie.andserver:processor:2.1.12'

运行试下(192.1.1.1:8080/123),别忘了改成自己的手机IP

在这里插入图片描述

以下是Kotlin写法

老样子先看目录结构

在这里插入图片描述

网络权限少不了

在这里插入图片描述

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

AndServerEngine

在这里插入图片描述

object AndServerEngine {

    private var mAndServer: Server? = null

    fun startup() {
        if (mAndServer?.isRunning == true) {
            Log.i("ABCD", "AndServer已经启动")
            return
        }

        AndServer
            .webServer(App.sContext)
            .port(8899)
            .timeout(10, TimeUnit.SECONDS)
            .listener(object : Server.ServerListener {
                override fun onStarted() {
                    Log.i("ABCD", "AndServer启动成功")
                }

                override fun onStopped() {
                    Log.i("ABCD", "AndServer关闭成功")
                }

                override fun onException(e: Exception?) {
                    Log.i("ABCD", "AndServer出现异常", e)
                }

            })
            .build()
            .apply {
                mAndServer = this
                startup()
            }
    }

    fun shutdown() {
        val server = mAndServer
        if (server?.isRunning == true) {
            server.shutdown()
            mAndServer = null
        } else {
            Log.i("ABCD", "AndServer没有启动")
        }
    }

}

App,这里是原作者写在清单文件中的 name

在这里插入图片描述

class App : Application() {

    companion object {
        lateinit var sContext: App
    }

    override fun onCreate() {
        super.onCreate()
        sContext = this
    }
}

MainActivity 俩按钮,一个开一个关

在这里插入图片描述

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<Button>(R.id.startBtn).setOnClickListener { AndServerEngine.startup() }
        findViewById<Button>(R.id.stopBtn).setOnClickListener { AndServerEngine.shutdown() }
    }
}

UserController

在这里插入图片描述

@RestController
@RequestMapping(path = ["/user"])
class UserController {

    //192.1.1.1:8899/user/login?account=Test&password=123456
    @GetMapping("/login")
    fun login(@QueryParam("account") account: String?, @QueryParam("password") password: String?): String {
        Log.i("ABCD", "收到登录请求,account = $account,password = $password")
        return "Successful!"
    }

}

以上是代码部分,以下是配置,上车!上车!

在这里插入图片描述

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.4.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
        classpath 'com.yanzhenjie.andserver:plugin:2.1.9' // AndServer
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在这里插入图片描述

    id 'com.yanzhenjie.andserver' // AndServer

在这里插入图片描述

    // AndServer
    implementation 'javax.activation:javax.activation-api:1.2.0'
    implementation 'com.yanzhenjie.andserver:api:2.1.9'
    kapt 'com.yanzhenjie.andserver:processor:2.1.9'

运行看下效果 (192.1.1.1:8899/user/login?account=Test&password=123456)

在这里插入图片描述

安排了,制作不易,制作不易,三连走起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简历】兰州某大学一本硕士:面试通过率基本是为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一个一本硕士的Java简历&#xff0c;那这个简历因为学校本身&#xff0c;它是一个一本的硕士&#xff0c;我们一般认为这一本硕士&a…

北极花APP携“项目协作”等新功能 亮相2024年生物多样性学术会议(7.14-15)

7月14-15日&#xff0c;由中国环境科学研究院等单位共同主办的2024年生物多样性学术会议在河北雄安召开。北极花创始人胡理乐教授受邀参加此次会议&#xff0c;并做专题报告&#xff0c;分享《北极花APP&#xff1a;数智赋能生物多样性监测与保护》。 胡教授将在会议上介绍北极…

设计云桌面用虚拟化行不行?

信息化日益深入发展&#xff0c;企业和组织对于灵活、高效且安全的办公环境需求愈发迫切。云桌面作为一种新兴的解决方案&#xff0c;凭借其虚拟化技术的优势&#xff0c;正在逐步改变传统的设计办公模式。 那么&#xff0c;设计云桌面采用虚拟化技术到底行不行&#xff1f;随…

SAP HCM 如何知道标准程序有自定义增强代码 Configure Debugger Layer

导读 INTRODUCTION Configure Debugger Layer &#xff1a;今天分享下我在处理HCM业务中&#xff0c;如何通过debug的Configure Debugger Layer找到标准程序中的客制化的代码&#xff1f;也许在网上查看到很多找badi的方法或者其他的办法&#xff0c;但是这些办法比较繁琐&…

【k8s部署elasticsearch】k8s环境下安装elasticsearch集群和kibana

文章目录 简介一.条件及环境说明二.需求说明三.实现原理及说明四.详细步骤4.1.规划节点标签4.2.创建三个statefulset和service headless配置4.3.创建service配置 五.安装kibana六.调整索引分区七.安装说明 简介 k8s集群中搭建有elasticsearch服务一般都会用到pvc&#xff0c;但…

Unity AssetsBundle 详解

文章目录 1.AssetBundle 概念2.AssetBundle 优势3.AssetBundle 特性4.AssetBundle 使用流程4.1 分组4.2 打包4.3 加载包4.4 加载资源4.5 卸载资源 5.AssetBundleManifest6.AssetBundle的内存占用7.AB包资源加密 1.AssetBundle 概念 AssetBundle又称AB包&#xff0c;是Unity提供…

Linux项目自动化构建工具make/Makefile

目录 前言1. Makefile 文件的基本构成2. makefile的依赖关系的自动化推导3. make执行过程中的一些现象及其原理3.1 证明该现象原理3.2 关于 stat 时间属性的拓展 前言 身处 linux 平台环境开发中的伙伴们都知道 gcc/g 编译器以及编译指令&#xff0c;但是不难想象在以后的生活…

解决方案 | IP地址申请专用HTTPS证书的常见问题

IP地址专用的HTTPS证书是一种专门为IP地址设计的SSL/TLS证书&#xff0c;它可以通过HTTPS协议安全地访问基于IP地址实现的网站或服务&#xff0c;以下是申请IP地址https证书时经常遇到的问题以及解决办法。 一 、如何选择合适的IP地址https证书的类型&#xff1f; 1、DV类型IP…

水文:CBA业务架构师

首先&#xff0c; 我们来了解一下什么是CBA业务架构师&#xff1f; CBA业务架构师认证是由业务架构师公会(Business Architecture Guild)授予的一种专业认证。标志着证书持有者已经掌握了业务架构的核心技能和知识&#xff0c;能够在实际工作中熟练运用业务架构技术和框架&…

安全极客团队荣获首届“矩阵杯”网络安全大赛人工智能挑战赛“三等奖”

近日&#xff0c;东半球规格高、规模大且奖金丰厚的网络安全顶级赛事——首届“矩阵杯”网络安全大赛在青岛国际会议中心圆满落幕。本次大赛设置了五大赛事&#xff0c;包括通用产品漏挖赛、国产软硬件安全检测赛、原创漏洞挖掘赛、人工智能&#xff08;大模型&#xff09;挑战…

CDH实操--集群卸载

作者&#xff1a;耀灵 1、停止正在运行的服务 a、控制台停止集群服务 b、控制台停止Cloudera Management Service c、命令行停止cm服务 systemctl stop cloudera-scm-agent #所有节点执行 systemctl stop cloudera-scm-server #cdh01节点执行2、主线并移除Parcles rm -r…

【完结】LeetCode 热题 HOT 100分类+题解+代码详尽指南

目录 LeetCode 热题 100 前言 Leetcode Top100题目和答案-哈希 Leetcode Top100题目和答案-双指针篇 Leetcode Top100题目和答案-滑动窗口篇 Leetcode Top100题目和答案-子串篇 Leetcode Top100题目和答案-普通数组篇 Leetcode Top100题目和答案-矩阵篇 Leetcode Top1…

ABAQUS大连正版代理商:亿达四方——开启东北工业智能仿真新篇章

在东北老工业基地的振兴道路上&#xff0c;大连以其独特的地理位置和深厚的产业基础&#xff0c;成为推动区域经济发展的领头羊。作为国际知名的仿真软件ABAQUS在大连地区的官方授权代理商&#xff0c;亿达四方正以科技创新为驱动&#xff0c;引领当地制造业迈向数字化、智能化…

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

目录 多态基本概念 virtual关键字 C11 override 和 final 举个栗子 析构函数的重写(基类与派生类析构函数的名字不同) 多态基本概念 概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同…

Coze触发器:触发任务的Python接口源码

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze触发器 📒📝 触发器接口源码⚓️ 相关链接 ⚓️📖 介绍 📖 自动化,一个在现代软件开发中不可或缺的概念,它让我们的生活和工作变得更加高效。Coze也支持定时任务/触发任务,通过触发器,我们可以更自由的控制Bot去…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组② | 11.3 - 11.5

前言 第 11 章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.3 收集需求 11.3.1 主要输入 11.3.2 主要工具与技术 11.3.3 主要输出 11.4 定义范围 11.4.1 主要输入…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥派生(C/C++)】

密钥派生(C/C) 以HKDF256密钥为例&#xff0c;完成密钥派生。具体的场景介绍及支持的算法规格&#xff0c;请参考[密钥生成支持的算法]。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生成密钥 指定密钥别名。 初始化密钥属…

【JavaEE】Spring AOP详解

一.AOP的定义. Aspect Oriented Programming&#xff08;面向切面编程&#xff09;概括的来说AOP是一种思想, 是对某一类事情的集中处理 什么是面向切面编程呢? 切面就是指某一类特定问题, 所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢? 比如上个博客文章…

Python基础教学之四:面向对象编程——迈向更高级编程

Python基础教学之四&#xff1a;面向对象编程——迈向更高级编程 一、面向对象编程概念 1. 类和对象 定义&#xff1a;在面向对象编程(OOP)中&#xff0c;类是创建对象的模板&#xff0c;它定义了对象的属性和方法。对象是类的实例&#xff0c;具体存在的实体&#xff0c;拥有…

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)

1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈&#x1f62d;&#x1f62d;) 示例图…