最近闲暇无事,好多人问即时通讯怎么做的,尤其是对于当下大火的python更是如此,大多数人都知道一个xmpp或者xampp框架,于是开了简书,大致说明一下
不明白tcp/udp协议底层原理的,自行百度,这里就不再赘述。
在python中,要想实现即时通讯,需要明白socket协议的两个概念,socket.AF_INET和socket_STREAM,前者是通讯的IP协议模式,代表IPv4,IPv4跟IPv6的区别在于,IPv4是32位整数位经过8字节划分之后的取值,预想结果192.xx.xx.xx ,而IPv6是128位整数位划分之后的取值,预想结果xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx ,v4的长度是有限制的,20个字节,而v6理论上是没有限制的,这就是为什么大公司一般用v6而小公司用v4的原因。
后者socket_STREAM,见名知意,就是流的意思,这是一种服务端发送接收数据的数据形式,即字节(byte),在c/s交互的过程中,获取到数据的流,进行decode或者encode编码输出即可,编码格式大部分遵循utf-8,也有遵循gbk的,不再多说。
步骤:
1、创建客户端py文件,连接服务端IP地址即服务器地址,如连接成功,发送数据并进行对应编码;
2、创建服务端py文件,绑定域名,服务器挂起也就是等待连接,一旦接受到客户端发送的数据,服务器自动进行处理;
核心代码:
服务端(server.py):
import socket
#创建服务
server= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP、端口 这里我写的是本机的IP,只要是服务启动、端口对应就可以
server.bind(('192.168.1.112',8081))
#服务器监听
server.listen(10)
print('socket连接成功')
#等待连接 服务器挂起状态,等待客户端唤起
clientSocket,clirentAddress= server.accept()
# server.close() 因为是长连接,close操作根据你项目的具体场景而定
#这里写一个死循环,执行下一步操作
while True:
#接收的数据 来自客户端
data= clientSocket.recv(1024)#这里填写1024即可,就是一kb,最大值
print('客户端:',data.decode('utf-8'))
if data:
backData= input('请回复客户端:')
clientSocket.send(backData.encode('utf-8'))
客户端(client.py):
import socket #导入包
client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('192.168.1.112',8081)) #IP地址跟端口号必须跟服务器一致
#循环执行操作
while True:
data= input('你对服务器说:') #传输数据
client.send(data.encode('utf-8')) #编码解析数据
info= client.recv(1024) #数据接收 (客户端接收来自服务器的)
print('服务器说:',info.decode('utf-8'))
这种写法只能是点对点发送信息,如果是点对多,需要循环执行对接的客户端,时间原因,不再敲代码。
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试