当前位置: 首页 > news >正文

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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {serverManager.startServer();}});button2.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onStarted() {Log.i(TAG, "onStarted: 服务器启动");}@Overridepublic void onStopped() {Log.i(TAG, "onStopped: 服务器关闭");}@Overridepublic 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 falseid '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? = nullfun 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 = thisstartup()}}fun shutdown() {val server = mAndServerif (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

在这里插入图片描述

    // AndServerimplementation '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)

在这里插入图片描述

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大语言模型LLM
  • 详解python基本语法
  • 每日一练——第四题
  • vue自制表格
  • 什么是TCP
  • vue3+TS从0到1手撸后台管理系统
  • rust + python+ libtorch
  • python用selenium网页模拟时xpath无法定位元素解决方法2
  • Spark中的JOIN机制
  • 集合的定义和特点
  • springboot个人证书管理系统-计算机毕业设计源码16679
  • <数据集>夜间车辆识别数据集<目标检测>
  • 设计模式-概述*
  • 记录些MySQL题集(9)
  • 深入解析PHP框架:Symfony框架详解与应用
  • __proto__ 和 prototype的关系
  • Codepen 每日精选(2018-3-25)
  • ES6系统学习----从Apollo Client看解构赋值
  • express.js的介绍及使用
  • Less 日常用法
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 不上全站https的网站你们就等着被恶心死吧
  • 创建一个Struts2项目maven 方式
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 类orAPI - 收藏集 - 掘金
  • 前端面试之闭包
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信支付JSAPI,实测!终极方案
  • 阿里云服务器购买完整流程
  • ​马来语翻译中文去哪比较好?
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​字​节​一​面​
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • ()、[]、{}、(())、[[]]命令替换
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计高校学生选课系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (四) 虚拟摄像头vivi体验
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Docker基本介绍
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Linux下编译安装log4cxx
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net framework 4.8 开发windows系统服务
  • .Net多线程Threading相关详解
  • .NET多线程执行函数