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

Android之间在在局域网下互传消息,咱就不用走云服务器了吧,让俩安卓设备,自己传呗

方式1 通过在安卓设备上搭建Web服务器接收数据,可参考

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

方式2 本文章,搭建Socket服务器,接收数据,发送TCP

此类文章网上一大堆,不多做讲解,直接上代码,自行参考

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7001495969ce4b6fad6cc4131605e174.png

清单文件中添加权限

在这里插入图片描述

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

MainActivity

class MainActivity : AppCompatActivity() {var mBinding: ActivityMainBinding? = nullvar timer: Timer? = nullvar mSocket: Socket? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)this.window.statusBarColor = this.resources.getColor(R.color.white)this.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BARmBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)requestPermission()mBinding!!.tv1.setOnClickListener {val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)startActivity(intent)}}override fun onResume() {super.onResume()if (mSocket != null){mSocket!!.close()mSocket = null}initServer()//定时器if (timer != null){timer!!.cancel()timer = null}timer = Timer()val timerTask: TimerTask = object : TimerTask() {override fun run() {runOnUiThread {//每次刷新再次操作//加个定时器,动态获取ip地址mBinding!!.tv1.text = "本机IP:${getLocalIpAddress()},端口号: 8020"}}}timer?.schedule(timerTask, 0, 1000) //开启刷新,第二个参数是多长时间之后开始倒计时,第三个参数是多长时间进行一次}private fun initServer(){object : Thread() {override fun run() {try {// 创建ServerSocket   E5 93 88 E5 93 88 E5 93 88 E5 93 88 0Aval serverSocket = ServerSocket(8020)Log.e("TAG","32131232321--开启服务器,监听端口 9569--" + getLocalIpAddress())// 监听端口,等待客户端连接while (true) {Log.e("TAG","32131232321--等待客户端连接--")mSocket = serverSocket.accept() //等待客户端连接Log.e("TAG","32131232321---得到客户端连接:$mSocket")mBinding!!.tv2.post {mBinding!!.tv2.text = "当前连接IP:${mSocket}"}startReader(mSocket!!)}} catch (e: IOException) {e.printStackTrace()}}}.start()}// 获取ip地址private fun getLocalIpAddress(): String? {val netManager =applicationContext.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManagerval info = netManager.activeNetworkInfo// 网络是否连接return if (info != null && info.isConnected) {// wifi类型if (info.type == ConnectivityManager.TYPE_WIFI) {getWifiIpAddress()} else {// 其他类型getEthIpAddress()}} else "0.0.0.0"}// 获取有线网络的ip4地址private fun getEthIpAddress(): String? {val infaceName = "eth0"val ip = "0.0.0.0"try {val netInterface: Enumeration<NetworkInterface> =NetworkInterface.getNetworkInterfaces()while (netInterface.hasMoreElements()) {val inface: NetworkInterface = netInterface.nextElement()if (!inface.isUp()) {continue}// eth0 有线网络判断if (infaceName != inface.getDisplayName()) {continue}val netAddressList: Enumeration<InetAddress> = inface.getInetAddresses()while (netAddressList.hasMoreElements()) {val inetAddress: InetAddress = netAddressList.nextElement()// 获取IP4地址if (inetAddress is Inet4Address) {return inetAddress.getHostAddress()}}}} catch (e: Exception) {}return ip}// 获取wifi的ip地址private fun getWifiIpAddress(): String? {val wifiManager = applicationContext.getSystemService(WIFI_SERVICE) as WifiManagerval wifiInfo = wifiManager.connectionInfo// 获取32位整型IP地址val ipAddress = wifiInfo.ipAddress//返回整型地址转换成“*.*.*.*”地址return String.format("%d.%d.%d.%d",ipAddress and 0xff, ipAddress shr 8 and 0xff,ipAddress shr 16 and 0xff, ipAddress shr 24 and 0xff)}/*** 从参数的Socket里获取消息*/private fun startReader(mSocket: Socket) {object : Thread() {override fun run() {try {// 获取读取流val ins = mSocket.getInputStream()val buf = ByteArray(32)//获取数据赋值while (ins.read(buf) > 0) {//收到客户端发送的数据之后再发//serverSendMessage(getAppData())mBinding!!.tvId.post {var mS = mBinding!!.tvId.text.toString();mS += String(buf)mBinding!!.tvId.text = mSsetML(String(buf))}/*if (buf != null) {//延迟销毁runOnUiThread {Handler().postDelayed({ins.close()if (mSocket != null){mSocket.close()}}, 3000)}}*/}} catch (e: IOException) {e.printStackTrace()}}}.start()/*object : Thread() {override fun run() {try {// 获取读取流val mIn = BufferedReader(InputStreamReader(mSocket.getInputStream(), "utf-8"))var line = ""Log.e("TAG","32131232321---*等待客户端输入---13132321*---")while (mIn.readLine().also { line = it } != null) { // 读取数据Log.e("TAG","32131232321---*等待客户端输入*")Log.e("TAG","32131232321----获取到客户端的信息:$line")}} catch (e: IOException) {e.printStackTrace()}}}.start()*/}//通过socket来给客户端发送消息private fun serverSendMessage(mServerSendMessage: String) {object : Thread() {override fun run() {val out: PrintWritertry {out = PrintWriter(BufferedWriter(OutputStreamWriter(mSocket!!.getOutputStream())),true)Log.e("TAG","32131232321---发送给客户数据*---" + mServerSendMessage)out.println(mServerSendMessage)} catch (e: IOException) {e.printStackTrace()}}}.start()}/*动态申请权限操作*/private var isPermissionRequested = falseprivate fun requestPermission() {if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {isPermissionRequested = trueval permissionsList: ArrayList<String> = ArrayList()val permissions = arrayOf<String>(//在这里加入你要使用的权限Manifest.permission.READ_CONTACTS,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.READ_CALENDAR,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_CONTACTS,Manifest.permission.ACCESS_WIFI_STATE,)for (perm in permissions) {if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {permissionsList.add(perm)// 进入这里代表没有权限.}}if (permissionsList.isNotEmpty()) {val strings = arrayOfNulls<String>(permissionsList.size)requestPermissions(permissionsList.toArray(strings), 0)}}}//单独处理命令private fun setML(ml: String){if (ml.contains("xc")){val intent = Intent(Intent.ACTION_PICK)//指定获取的是图片intent.type = "image/*"startActivityForResult(intent,10086)}if (ml.contains("qc")){mBinding!!.tvId.post {mBinding!!.tvId.text = ""}}}}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data></data><androidx.appcompat.widget.LinearLayoutCompatandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:textColor="#000000"android:text="本机IP"/><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:layout_marginTop="10dp"android:textColor="#000000"android:text="未连接"/><TextViewandroid:id="@+id/tv_id"android:layout_marginTop="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content" /></androidx.appcompat.widget.LinearLayoutCompat>
</layout>

因为用到了 DataBind,这里提一下吧

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open3d入门 点云中的重要概念

点云是由一组三维空间中的点组成的数据结构&#xff0c;常用于计算机视觉、3D建模和地形图生成等领域。每个点包含空间坐标&#xff08;x, y, z&#xff09;以及其他属性&#xff08;如颜色、密度等&#xff09;。以下是一些重要的点云概念&#xff1a; 1. 体素 (Voxel) 体素…

Vue3+Vite+TS+Axios整合详细教程

1. Vite 简介 Vite是新一代的前端构建工具&#xff0c;在尤雨溪开发Vue3.0的时候诞生。类似于Webpack Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个概念&#xff0c;服务器随起随用。生产中利用…

赛氪网荣获2024年中国高校计算机教育大会合作伙伴荣誉

2024年7月13日&#xff0c;在黑龙江哈尔滨召开的“2024年中国高校计算机教育大会&#xff08;CCEC2024&#xff09;”&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司(以下简称”赛氪网“)凭借其在高等教育与科技创新领域的卓越贡献&#xff0c;荣幸地获得了本次…

Python基础——函数

函数 和c语言函数意义相同&#xff0c;函数定义基础语法如下。 def 函数名&#xff08;传入参数&#xff09;:函数体return 返回值 展示自定义一个函数并对其进行封装。 # 自定义函数字符串长度计算str1 "itcast" count0 for x in str1:count 1 print(f"{c…

昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换

模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。…

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(九)-无人机服务区分离

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Solidworks工程图替换参考零件

1.用solidworks选择工程图文件&#xff0c;点击参考。 2.双击文件名 3.选择新的参考零件&#xff0c;点击确定。

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题&#xff1a; 有时在 Postgres 上部署 Rails 应用程序时&#xff0c;可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

力扣第406场周赛

力扣第406场周赛 100352. 交换后字典序最小的字符串 - 力扣&#xff08;LeetCode&#xff09; 贪心&#xff0c;从 0 0 0开始扫描到 n n n如果有一个可以交换的就立马交换 class Solution { public:string getSmallestString(string s) {for(int i1;i<s.size();i){if(s[i…

【PyQt】

PyQT5线程基础&#xff08;2&#xff09; 线程案例案例一案例二 线程案例 案例一 案例一代码通过线程实现点击按钮向线程传输地址&#xff0c;程序等待20秒后&#xff0c;返回结果。 通过QtDesigner创建如下图所示的界面ui&#xff0c;并用UIC工具转成对应的py文件。 Ui_tes…

C语言之指针的奥秘(三)

一、字符指针变量 在指针的类型中&#xff0c;有字符指针char*&#xff0c;一般使用&#xff1a; #include<stdio.h> int main() {char ch w;char* p &ch;*p w;return 0; } 还有一种方式&#xff1a; #include<stdio.h> int main() {const char* p &qu…

123456

截止2023年10月&#xff0c;目前已公开的官方矢量数据有3个网站&#xff0c;按照公开时间顺序分别是&#xff1a;1&#xff09;全国地理信息资源目录服务系统&#xff1b;2&#xff09;西藏自治区自然资源厅&#xff1b;3&#xff09;福建省标准地图服务。我们将持续更新公开的…

2024较火的软件宣传单页HTML源码

源码介绍 2024较火的软件宣传单页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果截图 源码获取 2024较火的软件宣传单页HTML源码

自动驾驶可能解决的问题

首先是各种盲区&#xff0c;雷达可能检测到各种东西&#xff0c;而这些是视觉注意不到的 然后是每辆车可以互联互通&#xff0c;整体规划路线

Java二十三种设计模式-单例模式(1/23)

引言 在软件开发中&#xff0c;设计模式是一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。单例模式作为其中一种创建型模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。本文将深入探讨单例模式的概念、实现方式、使用场景以及潜…

通讯录管理(C++入门练习)

通讯录管理系统 系统需求&#xff1a; 通讯录是一个可以记录亲人、好友信息的工具。本文主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人&#xff0c;信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人 显示联系…

昇思25天学习打卡营第21天|DCGAN生成漫画头像

DCGAN原理 DCGAN&#xff08;深度卷积对抗生成网络&#xff0c;Deep Convolutional Generative Adversarial Networks&#xff09;是GAN的直接扩展。不同之处在于&#xff0c;DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…

数据结构历年考研真题对应知识点(哈夫曼树和哈夫曼编码)

目录 5.5.1哈夫曼树和哈夫曼编码 1.哈夫曼树的定义 2.哈夫曼树的构造 【分析哈夫曼树的路径上权值序列的合法性&#xff08;2010&#xff09;】 【哈夫曼树的性质&#xff08;2010、2019&#xff09;】 3.哈夫曼编码 【根据哈夫曼编码对编码序列进行译码&#xff08;201…

【AMBA】AXI总线中的AXLEN、AXSIZE、AXBURST和4K边界

文章目录 AXI传输层级概念AXLEN[7:0]定义突发传输长度AXSIZE[2:0]定义突发传输transfer的位宽AXBURST[1:0]定义突发传输类型4K边界 AXI传输层级概念 在手册的术语表中&#xff0c;与 AXI 传输相关的有三个概念&#xff0c;分别是 transfer(beat)、burst、transaction。用一句话…