再帮助同学坐课题的时候接触到了scoket通信,了解到这应该是基层网络通信的原理,于是就导出搜索了一下相关的资料,简单来说scoket通信就是,可以让不同设备在同一个网络环境的条件下,可以实现相互通信既可以一对一也可以一对多,总之这对开发者来说,是跨设备交互的非常好的一种方式
本文主要实现两个功能,一是python与pyhon程序之间的通信,另一个是将客户端改为手机,电脑链接手机wifi,在同一网络环境下电脑与wifi的通信。python 与 python 的交互参考的是B站白夜黑羽的教程,特此鸣谢。
在多人交互通信的过程中,服务器就是一个中转站的作用,他通过配置好需要使用的参数,等待客户端的链接
在python种使用的是scoket基础库来进行实现的,也就是不需要额外安装,只要你安装了python 你导入就可以了,接下来逐步讲解下面的部分。
from socket import *
IP = '127.0.0.1'
SERVER_PORT = 50000
BUFLEN = 512
listenSocket = socket(AF_INET,SOCK_STREAM)
listenSocket.bind((IP,PORT))
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())
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()
前面的步骤和服务器端基本一样,所以我这里进行一些合并
from socket import *
IP = '127.0.0.1'
SERVER_PORT = 50000
BUFFLEN = 512
dataScoket = socket(AF_INET,SOCK_STREAM)
dataScoket.connect((IP,SERVER_PORT))
while True:
toSend = input('>>> ')
if toSend =='exit':
break
# 发送消息,也要编码为bytes
dataScoket.send(toSend.encode())
# 等待接受服务段的消息
reved = dataScoket.recv(BUFFLEN)
# 如果返回空bytes,表示对方关闭了链接
if not reved:
break
print(reved.decode())
// 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
# 发送消息,也要编码为bytes
dataScoket.send(toSend.encode())
# 等待接受服务段的消息
reved = dataScoket.recv(BUFFLEN)
# 如果返回空bytes,表示对方关闭了链接
if not reved:
break
print(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浏览器安装即可
手机端实现的是客户端的程序,电脑需要运行服务器程序
问题来了关键点怎么让手机和电脑能通过网络通信呢
其实有两种方法,第一种就是买一个服务器阿里云或者腾讯云,在云服务器上部署Scoket通信服务端然后,使用电脑和手机两个客户端程序通过服务器程序进行通信。这个过程就比较复杂,在这里我们弄一个简单的方法,就是电脑连手机热点。
首先开启手机热点,电脑连接手机热点。
之后我们要查看热点的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的跨设备通信
但是会存在非常明显的题
上面的基础实例只能实现一对一聊天,并不能实现多对多,而且客户端的代码是单线程的,发送消息和接收消息是线性关系,也就是发送了一条消息之后,接收一条消息,然后等待发送消息,在等待键盘输入要发的消息的过程中客户端是接收不到任何信息的,所以需要把客户端的程序改成两个线程一个负责接收一个负责发送,之后就是更改服务器端,让服务器端可以连接多个客户端,而且可以监听每个客户端耳的消息且广播给各个客户端,实现结果如下。
服务器可以监听多个客户端的连接,且可以接收多个客户端的发送的信息
我进行了如下的操作步骤