手机电脑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.rhkb.cn/news/126517.html

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

相关文章

视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法2.0

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

Ribbon负载均衡+Nacos服务搭建

Ribbon负载均衡 流程 首先通过RibbonLoadBalanceerClient获取服务名,并传给DynamicServerListLoadBalancer——>通过EureKa-server获取服务名对应服务列表(也就是被注册到EureKa中的服务,可能包括不同端口的),然后我们会根据IRule中的服务…

基于SSM的网络游戏公司官方平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

快手用户活跃度分析(未完成)

目标 为期30天的用户数据,但是不是所有的用户都有30天的信息数据,比如用户A第7天注册的,则其前6天没有数据。 预测未来用户活跃度的可能性。 预测7天后的,基于第7天,预测第14天,基于第8天,预测…

快手根据ID取商品详情 API 返回值说明

item_get-根据ID取商品详情 ks.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)API接口secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_s…

手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

延时消息队列

目录 前言 一、延时队列实用场景 二、DelayQueue DelayQueue的实现 使用延迟队列 DelayQueue实现延时任务的优缺点 三、RocketMQ 原理 四、Kafka 原理 实现 DelayMessage定义 消息发送代码 消费者代码 参考 前言 延时队列的内部是有序的,最重要的…

Mysql底层数据结构为什么选择B+树

索引底层采用什么数据结构,为什么使用B树而不是其他数据结构: (1)如果采用二叉树:使用递增字段作为索引时,二叉树会退化成链表,查找效率太低 (2)如果采用红黑树&#xf…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

HJ48 从单向链表中删除指定值的节点

Powered by:NEFU AB-IN Link 文章目录 HJ48 从单向链表中删除指定值的节点题意思路代码 HJ48 从单向链表中删除指定值的节点 题意 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 思路 单向链表…

05-JVM内存分配机制深度剖析

上一篇:04-JVM对象创建深度剖析 1.对象栈上分配 我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力&#xff…

Linux权限问题

文章目录 前言一、shell 命令1、什么是 shell?2、什么是 shell 脚本?3、shell环境4、总结 二、Linux权限1、su命令2、Linux文件类型3、Linux文件权限4、文件访问权限的相关设置4.1 chmod指令4.2 chown指令4.3 chgrp指令4.4 总结 前言 一、shell 命令 1、什么是 sh…

Maven学习记录

一、Maven是什么 简单来说Maven是一个标准化的java管理和构建工具,它提供了一系列规范,包括项目结构,构建流程(编译,测试,打包,发布……),依赖管理等。 标准化就是定下…

探究SpringWeb对于请求的处理过程

探究目的 在路径归一化被提出后,越来越多的未授权漏洞被爆出,而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…

43、Flink之Hive 读写及详细验证示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

React 开发一个移动端项目(1)

技术栈: 项目搭建:React 官方脚手架 create-react-appreact hooks状态管理:redux 、 redux-thunkUI 组件库:antd-mobileajax请求库:axios路由:react-router-dom 以及 historyCSS 预编译器:sass…

计算机竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

机器学习笔记之最优化理论与方法(四) 凸函数:定义与基本性质

机器学习笔记之最优化理论与方法——再回首:凸函数定义与基本性质 引言凸函数的定义严格凸函数凸函数的推论:凹函数 常见凸函数凸函数的基本性质几种保持函数凸性的运算凸集与凸函数之间的关联关系 引言 本节将介绍凸函数定义及其基本性质。 本文是关于…

【Unity-Cinemachine相机】相机跟随之Transposer属性

相机跟随和瞄准行为 Transposer:虚拟相机将在某个固定的偏移或距离上跟随目标移动 上面的偏移量就是Follow Offset Binding Mode决定Follow Offset是目标本地坐标系下的身后十米还是世界坐标系下的身后十米 Lock To Target On Assign:锁定自己和目标本地…