手机电脑scoket通信 手机软件 APP inventor 服务端程序python

python scoket 通信

再帮助同学坐课题的时候接触到了scoket通信,了解到这应该是基层网络通信的原理,于是就导出搜索了一下相关的资料,简单来说scoket通信就是,可以让不同设备在同一个网络环境的条件下,可以实现相互通信既可以一对一也可以一对多,总之这对开发者来说,是跨设备交互的非常好的一种方式


本文主要实现两个功能,一是python与pyhon程序之间的通信,另一个是将客户端改为手机,电脑链接手机wifi,在同一网络环境下电脑与wifi的通信。python 与 python 的交互参考的是B站白夜黑羽的教程,特此鸣谢。

python 服务器端

在多人交互通信的过程中,服务器就是一个中转站的作用,他通过配置好需要使用的参数,等待客户端的链接
在python种使用的是scoket基础库来进行实现的,也就是不需要额外安装,只要你安装了python 你导入就可以了,接下来逐步讲解下面的部分。

  • 第一步导入scoket库中的文件
from socket import *
  • 第二步初始化用到参数变量
  1. IP地址
IP = '127.0.0.1'
  1. 服务器端口号
SERVER_PORT = 50000
  1. 缓冲区读取的字节数据的大小
BUFLEN = 512
  • 第三步
    实例化一个scoket对象
    参数AF_INET 表示该scoket网络层使用的IP协议
    参数SOCK_STREAM 表示该scoket传输使用tcp协议
listenSocket = socket(AF_INET,SOCK_STREAM)
  • 第四步scoket绑定指定IP的端口
listenSocket.bind((IP,PORT))
print(f'服务端启动成功,在{PORT}端口等待客户链接...')
  • 第六步等待客户端的链接
    dataScoket为链接之后生成对象之后会调用该对象的内部函数来执行读取和发送
    addr为链接成功之后的客户端的地址
dataScoket,addr = listenSocket.accept()
print('接受一个客户端链接',addr)
  • 第六步循环监听客户端的消息,并将接收到的消息返回
    进入循环使用dataScoket监听客户端的消息,最多接收的消息为BUFLEN个字节如果返回的是一个空值,则表明客户端已经进行离线操作,则服务器程序跳出循环,执行下线程序,如果接收到了信息,则在中断打印信息并将,信息发送给客户端。
    注意:由于scoket发送的是字节数据所以发送时要对数据进行编码所以接收时候要进行解码操作也就是要给接收到的数据加个.decode()后缀,发送消息时要进行编码默认的编码给发送的数据后加上.encode()后缀,进行编码操作
while True:recved = dataScoket.recv(BUFLEN)if not recved:break#读取的字节数据是bytes类型,需要解码为字符串info = recved.decode()print(f'收到对方信息:{info}')#发送的数据类型必须是bytes,所以需要编码dataScoket.send(f'服务端收到的信息:{info}'.encode())
  • 第七步执行退出通信循环之后的关闭监听对象和通信对象
dataScoket.close()
listenSocket.close()

服务器端完整代码如下

# ==TCP 服务端程序 server.py ===
# netstat -an|find/i "5000"
from socket import *# 主机地址,表示绑定本机所有网络接口IP
IP = '127.0.0.1'
# 端口号
PORT = 50000
# 定义一次从scoket缓冲区最多读入512个字节数据
BUFLEN = 512# 实例化一个scoket对象
# 参数AF_INET 表示该scoket网络层使用的IP协议
# 参数SOCK_STREAM 表示该scoket传输使用tcp协议
listenSocket = socket(AF_INET,SOCK_STREAM)# socket绑定地址核端口
listenSocket.bind((IP,PORT))# 使scoket处于监听状态,等待客户端的链接请求
# 参数5表示 最多接受多少个等待连接的客户端
listenSocket.listen(5)
print(f'服务端启动成功,在{PORT}端口等待客户链接...')dataScoket,addr = listenSocket.accept()
print('接受一个客户端链接',addr)while True:recved = dataScoket.recv(BUFLEN)if not recved:break#读取的字节数据是bytes类型,需要解码为字符串info = recved.decode()print(f'收到对方信息:{info}')#发送的数据类型必须是bytes,所以需要编码dataScoket.send(f'服务端收到的信息:{info}'.encode())# 服务段也调用close() 关闭scoket
dataScoket.close()
listenSocket.close()

python 客户端

前面的步骤和服务器端基本一样,所以我这里进行一些合并

  • 第一步从scoket中导入全部内容,设置IP地址,服务端口号,以及待接收缓冲区字节长度
from socket import *IP = '127.0.0.1'
SERVER_PORT = 50000
BUFFLEN = 512
  • 第二步实例化scoket对象指明协议
    参数AF_INET 表示该scoket网络层使用的IP协议
    参数SOCK_STREAM 表示该scoket传输使用tcp协议
dataScoket = socket(AF_INET,SOCK_STREAM)
  • 第三步与服务器端的scoket链接
dataScoket.connect((IP,SERVER_PORT))
  • 第四步进行通信循环
    通过input函数接收输入信息,如果接收到exit则退出通信循环,进行关闭scoket对象指令,使用dataScoket.send(toSend.encode())发送从键盘输入的消息,使用reved = dataScoket.recv(BUFFLEN)接收服务端发来的消息,如果服务器端返回了一个空消息则关闭了链接,则退出客户端的通信循环,执行关闭scoket对象指令操作。
while True:toSend = input('>>> ')if toSend =='exit':break# 发送消息,也要编码为bytesdataScoket.send(toSend.encode())# 等待接受服务段的消息reved = dataScoket.recv(BUFFLEN)# 如果返回空bytes,表示对方关闭了链接if not  reved:breakprint(reved.decode())
  • 关闭scoket对象
// A code block
var foo = 'bar';

客户端完整代码如下

from socket import *IP = '127.0.0.1'
SERVER_PORT = 50000
BUFFLEN = 512# 实例化一个scoket对象,指明协议
dataScoket = socket(AF_INET,SOCK_STREAM)# 链接服务端scoket
dataScoket.connect((IP,SERVER_PORT))while True:toSend = input('>>> ')if toSend =='exit':break# 发送消息,也要编码为bytesdataScoket.send(toSend.encode())# 等待接受服务段的消息reved = dataScoket.recv(BUFFLEN)# 如果返回空bytes,表示对方关闭了链接if not  reved:breakprint(reved.decode())dataScoket.close()

代码运行效果

首先运行服务器端程序
显示服务器启动在50000号端口等待链接
在这里插入图片描述
之后运行客户端程序,服务端显示已经接收一个
在这里插入图片描述在客户端输入一个消息并发送,接收到了服务器端返回的握手信息
在这里插入图片描述
服务器端显示接收信息
在这里插入图片描述

手机软件与电脑通信

本文使用的手机软件是华南理工大学杨道全老师开发的APP inventor2 汉化增强版,目前已经收费但是仍有一定的使用期。
APP inventor2网站链接: https://www.wxbit.com/?loginref
我这里免费提供apk以及项目文件aia,以及我在网上找的scoket 客户端插件
如果你不想开会员想用免费的你就用APP INVNETOR1导入插件,再制作软件,文章最后我会给出APP INVENTOR2的代码块。
APP inventor1链接: http://app.gzjkw.net/login/

文件链接: https://pan.baidu.com/s/16HFo0gJxcLPzBUSDyEG7dA
提取码:5wow

在这里插入图片描述

aia文件导入方法请移步这篇文章前段
链接: https://blog.csdn.net/chrnhao/article/details/112758514

apk 文件直接用微信发给手机然后使用QQ浏览器安装即可
手机端实现的是客户端的程序,电脑需要运行服务器程序

将手机APP与电脑置于一个网段下

问题来了关键点怎么让手机和电脑能通过网络通信呢
其实有两种方法,第一种就是买一个服务器阿里云或者腾讯云,在云服务器上部署Scoket通信服务端然后,使用电脑和手机两个客户端程序通过服务器程序进行通信。这个过程就比较复杂,在这里我们弄一个简单的方法,就是电脑连手机热点。

首先开启手机热点,电脑连接手机热点。
之后我们要查看热点的IP地址这里也有两种方法

  • 找到电脑又下角的wifi图标
    在这里插入图片描述
    连接上热点之后点击热点下面的属性
    在这里插入图片描述
    滑倒底部查看IPv4的地址,OK这就是我们要填在手机和客户端里的地址了
    在这里插入图片描述
    或者运行如下代码,其打印的就会是目前连接的IP地址,这里不需要去知道为什么,其实没什么用。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# get local machine IP address
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
print(ip)
s.close()

在这里插入图片描述

然后我们把这个IP地址输入到我们最开始连接的服务端程序中,设置端口号为5000,运行成功之后等待连接这时候我们打开手机
在这里插入图片描述
注意必须用你开热点的手机打开这个APP
在上方填入IP地址和端口号点击连接
在这里插入图片描述
手机这里会提示链接成功
在这里插入图片描述

然后电脑的服务器端会显示收到一个客户的信息显示已经接收到一个客户端连接,兵并且收到手机客户端给电脑服务器端发送的已连接的消息。
在这里插入图片描述
接下来就能通信了在手机上随便发点消息就好
在这里插入图片描述
以上就完成了夸设备连接的基础入门,可以做一些非常简单的开发。

接下来我把APP INVENTOR2汉化增强版的代码块贴上
为了降低学习难度,所以只用了非常少的代码块
在这里插入图片描述

结束以及后续已经完成的工作

虽然实现了scoket的跨设备通信

但是会存在非常明显的题
上面的基础实例只能实现一对一聊天,并不能实现多对多,而且客户端的代码是单线程的,发送消息和接收消息是线性关系,也就是发送了一条消息之后,接收一条消息,然后等待发送消息,在等待键盘输入要发的消息的过程中客户端是接收不到任何信息的,所以需要把客户端的程序改成两个线程一个负责接收一个负责发送,之后就是更改服务器端,让服务器端可以连接多个客户端,而且可以监听每个客户端耳的消息且广播给各个客户端,实现结果如下。

服务器可以监听多个客户端的连接,且可以接收多个客户端的发送的信息
我进行了如下的操作步骤

  1. 运行服务端程序
  2. 运行客户端1程序
  3. 运行客户端2程序
  4. 使用客户端1发送消息12345
  5. 使用客户端2发送消息1564565
    最终三个控制台输出结果如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    实现了广播通信了之后我申请了一个阿里云服务器,在上面搭建了scoket客户端
    实现了广播,服务器私发,设备与设备通过服务器私发功能,服务器端用pyside2制作了一个简易的的客户端软件
    在这里插入图片描述
    在这里插入图片描述
    服务器对客户端私发
    在这里插入图片描述
    如果这篇文章看的人多了,且有需要的话,我再把结束部分内容更新了,或者有这方面需要的话可以留言或者私信联系我。
    好完结撒花

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

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

相关文章

ubuntu20.04+ROS noetic在线运行单USB双目ORB_SLAM

双目摄像头主要有以下几种,各有优缺点。 1.单USB插口,左右图像单独输出2.双USB插口,左右图像单独输出(可能存在同步性问题)3.双USB插口,左右图像合成输出4.单USB插口,左右图像合成输出 官方版…

[SSM]MyBatisPlus进阶

三、进阶篇 3.1映射 3.1.1自动映射规则 表名和实体类名映射 -> 表名user 实体类名User字段名和实体类属性名映射 -> 字段名name 实体类属性名name字段名下划线命名方式和实体类属性驼峰命名方式映射 -> 字段名 user_email 实体类属性名 userEmail 开启驼峰命名 m…

【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目,来演示CocosCreator 的项目结构。 等待创建完成后,会得到以下项目工程: 一、assets文件夹 assets文件夹:为资源目录,用来存储所有的本地资源,如各种图片,脚本…

webpack(三)loader

定义 loader用于对模块的源代码进行转换,在imporrt或加载模块时预处理文件 webpack做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定文件中。 在webpack内部,任何文件都是模块&#x…

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评 2022年全国儿童青少年总体近视率为53.6%,其中6岁儿童为14.5%,小学生为36%,初中生为71.6%,高中生为81%,近视已成为当下人们遇到的比较普遍的眼健康问题…

qt连接tcp通信和连接数据库

通过数据库实现学生管理系统 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库 Studemt.dbif(!db.co…

线性表之-单向链表(无头)

目录 什么是单向链表 顺序表和链表的区别和联系 顺序表: 链表: 链表表示(单项)和实现 1.1 链表的概念及结构 1.2单链表(无头)的实现 所用文件 将有以下功能: 链表定义 创建新链表元素 尾插 头插 尾删 头删 查找-给一个节点的…

没有软件怎么管理固定资产

在当今数字化的世界中,我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而,当我们面临一个看似简单的问题——如何管理固定资产时,我们可能会感到困惑。那么,如果没有软件,我们该如何进行资产管理呢&#xf…

ClickHouse配置Hdfs存储数据

文章目录 背景配置单机配置HA高可用Hdfs集群性能测试统计trait最多的10个trait term统计性状xxx minValue > 500 0000的数量结论 参考文档 背景 由于公司初始使用Hadoop这一套,所以希望ClickHouse也能使用Hdfs作为存储 看了下ClickHouse的文档,拿Hdf…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

无涯教程-Flutter - 简介

Flutter是一个由谷歌开发的开源移动应用软件开发工具包,用于为Android、iOS、 Windows、Mac、Linux、Google Fuchsia开发应用。 通常,创建移动应用程序是一个非常复杂和具有挑战性的任务。有许多框架可用,它提供了开发移动应用程序的出色函数…

es倒排索引深入解读

文章目录 一. Lucene二.倒排索引算法2.1 Posting List压缩算法2.1.1 FOR2.1.2 RoaringBitmap压缩 2.3 FST压缩算法2.3.1 trie前缀树原理2.3.2 FST构建过程NFADFAFSMFSAFST:有限状态转换机构建原理FST在lucene中实现原理 1.什么是搜索引擎? 全文搜索引擎: 自然语言处理(NLP)、爬…

华为OD机试 - 等和子数组最小和 - 深度优先搜索(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…

无涯教程-Android - Grid View函数

Android GridView在二维滚动网格(行和列)中显示项目,并且网格项目不一定是预定的,但它们会使用ListAdapter自动插入到布局中 Grid View - Grid view ListView 和 GridView 是 AdapterView 的子类,可以通过将它们绑定到 Adapter 来填充&#x…

flutter 上传图片并裁剪

1.首先在pubspec.yaml文件中新增依赖pub.dev image_picker: ^0.8.75 image_cropper: ^4.0.1 2.在Android的AndroidManifest.xml文件里面添加权限 <activityandroid:name"com.yalantis.ucrop.UCropActivity"android:screenOrientation"portrait"andro…

C#添加WebApi,配置Swagger

1、创建一个WebAPI项目 下载、安装、引入【Swashbuckle.AspNetCore】包 右击【解决方案】&#xff0c;然后点击【管理Nuget包】&#xff0c;搜索【Swashbuckle.AspNetCore】包 2、配置Swagger中间件 在【Startup.cs】文件中的【ConfigureService】类中添加如下代码。 在【Sta…

Spring AOP与静态代理/动态代理

文章目录 一、代理模式静态代理动态代理代理模式与AOP 二、Spring AOPSping AOP用来处理什么场景jdk 动态代理cglib 动态代理面试题&#xff1a;讲讲Spring AOP的原理与执行流程 总结 一、代理模式 代理模式是一种结构型设计模式&#xff0c;它允许对象提供替代品或占位符&…

肖sir__设计测试用例方法之边界值03_(黑盒测试)

设计测试用例方法之边界值 边界点定义 上点&#xff1a;边界上的点 离点&#xff1a;离上点最近的点&#xff08;即上点左右两边最邻近的点&#xff09; 内点&#xff1a;在域范围内的点 案例&#xff1a;qq号&#xff1a;5-12位 闭区间&#xff1a; 离点&#xff1a;5 位 &…

KC705开发板——MGT IBERT测试记录

本文介绍使用KC705开发板进行MGT的IBERT测试。 KC705开发板 KC705开发板的图片如下图所示。FPGA芯片型号为XC7K325T-2FFG900C。 MGT MGT是 Multi-Gigabit Transceiver的缩写&#xff0c;是Multi-Gigabit Serializer/Deserializer (SERDES)的别称。MGT包含GTP、GTX、GTH、G…