使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面
以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。
1. 创建项目
打开 Android Studio,新建一个 Empty Activity 的 Android 项目,填写好项目相关信息后等待项目构建完成。
2. 设计界面布局(activity_main.xml)
在res/layout目录下的activity_main.xml文件中,设计如下简单布局,包含一个用于输入消息的编辑文本框、发送按钮以及一个用于显示接收消息的文本视图:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/editTextMessage"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="16dp"android:layout_marginTop="16dp"android:layout_marginLeft="0dp"android:hint="输入要发送的消息" /><TextViewandroid:id="@+id/textViewReceivedMessages"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="64dp"android:layout_marginLeft="0dp"android:text="接收的消息:" /><Buttonandroid:id="@+id/buttonSend"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:layout_marginLeft="128dp"android:text="发送" /></LinearLayout>
3. 编写远程通信及逻辑代码(MainActivity.java)
在MainActivity.java文件中,添加以下代码来实现 TCP 通信以及相关的界面交互逻辑:
java
package com.example.myapplication;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;import androidx.appcompat.app.AppCompatActivity;
import java.io.FileOutputStream;
import java.io.OutputStream;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;public class MainActivity extends AppCompatActivity {private EditText editTextMessage;private TextView textViewReceivedMessages;private Socket socket;private BufferedReader reader;private BufferedWriter writer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);editTextMessage = findViewById(R.id.editTextMessage);Button buttonSend = findViewById(R.id.buttonSend);textViewReceivedMessages = findViewById(R.id.textViewReceivedMessages);// 尝试连接服务器,这里假设服务器IP是192.168.0.100,端口是8888,根据实际情况修改new Thread(() -> {try {socket = new Socket("192.168.1.6", 8888);reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));// 开启线程接收服务器消息receiveMessages();} catch (IOException e) {e.printStackTrace();}}).start();buttonSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String message = editTextMessage.getText().toString().trim();if (!message.isEmpty()) {new Thread(() -> {try {writer.write(message + "\n");writer.flush();} catch (IOException e) {e.printStackTrace();}}).start();}}});}private void receiveMessages() {try {while (true) {String receivedMessage = reader.readLine();if (receivedMessage!= null) {runOnUiThread(() -> {textViewReceivedMessages.append("\n" + receivedMessage);});}}} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();try {if (socket!= null) {socket.close();}if (reader!= null) {reader.close();}if (writer!= null) {writer.close();}} catch (IOException e) {e.printStackTrace();}}
}
代码解释如下:
- 在
onCreate方法中:- 首先通过
findViewById方法找到界面布局中的各个控件。 - 然后开启一个新线程去尝试连接远程服务器(IP 和端口按需修改),成功连接后获取输入输出流,并开启
receiveMessages方法所在的线程用于接收服务器发来的消息。 - 给发送按钮设置点击监听器,当点击按钮时,获取编辑文本框中的消息内容,若不为空则开启新线程将消息发送给服务器(注意要按协议添加换行符等规范格式,这里简单用
\n分隔消息)。
- 首先通过
receiveMessages方法:在一个循环中不断读取服务器发送过来的消息,每读取到一条消息,通过runOnUiThread方法将消息更新显示到界面的文本视图上(因为 Android 中涉及 UI 更新操作要在主线程执行)。onDestroy方法:在 Activity 销毁时,关闭相关的套接字、输入输出流等资源,防止资源泄漏。
4. 添加网络权限
在AndroidManifest.xml文件中,添加网络访问权限,确保 APP 可以进行网络通信:
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.remotecommunicationapp"><uses-permission android:name="android.permission.INTERNET" /><application...</application></manifest>
请注意:
- 上述代码中服务器的 IP 地址和端口号(示例中为
192.168.0.100和8888)要根据实际部署运行的服务器情况进行修改。 - 这只是一个简单的示例实现,实际应用中可以根据需求扩展功能,比如添加更多的界面交互、错误处理机制、加密通信等。还可以考虑使用更高级的网络通信框架来简化开发流程以及增强稳定性等。
运行这个 Android APP 后,在界面输入消息点击发送,就能将消息发送给对应的服务器,同时可以接收服务器返回的消息并显示在界面上。
界面

这里还需要要一个电脑做服务器,接受和发送消息
python
import socket# 创建套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP地址和端口
server_address = ('192.168.1.6', 8888)
server_socket.bind(server_address)# 监听连接
server_socket.listen(5)print('Server is listening on {}:{}'.format(*server_address))while True:# 接受客户端连接client_socket, client_address = server_socket.accept()print('Connected by', client_address)try:while True:# 接收客户端发送的数据data = client_socket.recv(1024)if data:print('Received data:', data.decode('utf-8'))# 发送响应数据给客户端,这里简单回复一个确认消息#client_socket.sendall('Message received successfully!'.encode('utf-8'))server_socket.sendall('Message received successfully!'.encode('utf-8'))else:breakfinally:# 关闭客户端连接套接字client_socket.close()
最终结果,我现在只能单向发送,一旦回复消息,就必然抛出异常。如有方法改正,还请指出!谢谢!

相关文章:
使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面
以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信(这里以 TCP 通信为例)的代码示例,包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio,新建一个 Empty Activity …...
学习Python的笔记14--迭代器和生成器
1.迭代器(Iterator) 概念: 迭代意味着重复多次,就像循环一样。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1.iter…...
车机端同步outlook日历
最近在开发一个车机上的日历助手,其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现,毕竟手机日历是手机厂商自己带的系统应用,根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…...
教学案例:k相同的一次函数的图像关系
【题目】 请在同一个平面直角坐标系中画出一次函数y2x, y2x4的图象,并观察图象,你发现这两个图形有什么位置关系?为什么? 【答案】 图象是相互平行的两条直线 【解析】 一、教学活动形式 这里设计的教学活动形式是“画图 →…...
EmoAva:首个大规模、高质量的文本到3D表情映射数据集。
2024-12-03,由哈尔滨工业大学(深圳)的计算机科学系联合澳门大学、新加坡南洋理工大学等机构创建了EmoAva数据集,这是首个大规模、高质量的文本到3D表情映射数据集,对于推动情感丰富的3D头像生成技术的发展具有重要意义…...
Elasticsearch vs 向量数据库:寻找最佳混合检索方案
图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…...
【Flink-scala】DataStream编程模型之水位线
DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之 数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之 窗口计算-触发器-驱逐器 文章目录 DataStream API编程模型前言…...
Python导入moviepy找不到editor 视频没有声音设置audio_codec参数
moviepy合成视频出错: 问题一:导入moviepy.editor找不到editor,No module named moviepy.editor问题二:合成的视频没有声音 问题一:导入moviepy.editor找不到editor,No module named moviepy.editor from …...
rsync 是一个非常强大的 Linux 工具,常用于文件和目录的同步、备份和传输。
rsync 是一个非常强大的 Linux 工具,常用于文件和目录的同步、备份和传输。它可以高效地同步本地和远程系统上的文件和目录,并且支持增量传输,仅同步发生变化的部分。rsync 支持压缩传输、删除多余文件、排除特定文件等多种功能,是日常运维、备份和迁移数据的重要工具。 一…...
触发器案例详解
目录 一、定义二、类型三、功能与用途四、创建与调用DML触发器格式示例DDL触发器格式示例登录触发器格式示例五、案例案例一:DML触发器 - 记录更新操作的触发器案例二:DML触发器 - 防止非法工资更新的触发器案例三:DDL触发器 - 记录表结构更改的触发器案例四:DDL触发器 - 防…...
jwt 与 sessionid 的区别及应用场景
在现代 Web 应用中,JWT(JSON Web Token)和SessionID是两种常用的用户认证和状态管理机制。本文从两者的原理、区别、优缺点以及适用场景展开分析,结合常见问题提出了最佳实践建议,帮助开发者更好地选择和使用。 JWT与S…...
tomcat和nginx
Tomcat 和 Nginx 都可以部署 Web 应用,但它们的核心功能和适用场景不同,因此在 2024 年生产环境及未来,是否使用 Tomcat 取决于需求和技术架构的特点。 1. Tomcat 的特点与适用场景 Tomcat 是 Java Servlet 容器,主要用来运行基于…...
服务器带宽与数据安全的重要性与作用
服务器带宽指的是服务器与外部网络通信的能力,即服务器发送和接收数据的速率。带宽越大,服务器在同一时间内能够处理的数据量就越多,数据传输的速度和稳定性也就越高。在数字化时代,企业对于数据的依赖程度日益加深,无…...
JSON数据处理
1. JSON注解 Data NoArgsConstructor AllArgsConstructor JsonIgnoreProperties(ignoreUnknowntrue) JSON注解: JsonIgnoreProperties(ignoreUnknowntrue) Hutool 日期格式化: DatePattern DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss")…...
FSWIND脉动风-风载时程生成器软件原理
大量风的实测资料表明,在风的时程曲线中,瞬时风速包含两个部分:一部分是自振周期一般在 10 分钟以上的平均风,另一部分是周期一般只有几秒左右的脉动风。平均风由于其周期一般比结构的自振周期大,因而考虑其作用性质相…...
搭建高可用负载均衡系统:Nginx 与云服务的最佳实践
搭建高可用负载均衡系统:Nginx 与云服务的最佳实践 引言 在项目开发过程中,我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段,系统的主要目的是功能实现和验证,单机架构足以满足开发人员的日常需求&…...
对比git命令与TortoiseGit工具,理解git解决冲突的过程
1 引言 此前用TortoiseSvn习惯了,所以,转到git时也同时选择了TortoiseGit工具。 同时,对比了可视化工具和git命令的操作,来深入理解git解决冲突的方式。 2 使用远程仓库替代本地仓库的内容 2.1 TortoiseGit做法 using “MERGE_…...
guava缓存的get方法的回调函数讲解一下
CacheBuilder.newBuilder()//设置缓存初始大小,应该合理设置,后续会扩容.initialCapacity(10)//最大值.maximumSize(100)//并发数设置.concurrencyLevel(5)//缓存过期时间,写入后10分钟过期.expireAfterWrite(600,TimeUnit.SECONDS)//统计缓存…...
React基础知识四 Hooks
什么是hooks? (coderwhy) hooks是react 16.8(2019年)出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候,函数式组件是非常鸡肋的,几乎没什么用。因…...
线性代数中的谱分解
一、谱分解的基本原理 谱分解(Spectral Decomposition)是线性代数中的一个重要概念,特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合,从而简化矩阵的运算和分析。谱分解通常适用于对称…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
