python网络通信数据传输之实战——聊天室
前言
经过前两篇的基础知识准备,终于到了实际操作的环节了,废话不多说,上菜!!!
聊天室实例
一、Request-Reply模式
(1)client:
import zmq
import sys
import threading
#配置
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:1") #localhost:2(随便一个端口号)
while(True):
data = input("input client data:")
if data == 'q':
sys.exit()
print(data)
socket.send(data.encode('utf-8'))
response = socket.recv()
print(response.decode("utf-8"))
(2)server:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:1")
while True:
message = socket.recv()
print("client:",message.decode("utf-8"))
reply = input("input reply:")
socket.send(reply.encode('utf-8'))
这种模式下是只能顺序一问一答,但是其实可以在一端一次输入多个数据,应该是暂存到缓存器了,等到另一端回应一个后,取出下一个继续回应,直到暂存回应完。
二、Publish-Subscribe模式:(消息群发)
(1)client1:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:55")
socket.setsockopt(zmq.SUBSCRIBE,b'')
while True :
response = socket.recv()
print ("response:%s" %response.decode("utf-8"))
(2)client2:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:55")
socket.setsockopt(zmq.SUBSCRIBE,''.encode('utf-8'))
while True:
response = socket.recv()
print ("response is :%s"%response.decode("utf-8"))
(3)server:
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:55")
while True:
print ("发送消息")
socket.send("消息群发".encode("utf-8"))
time.sleep(1)
广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。
三、Parallel Pipeline模式:
(1)client:
import zmq
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://127.0.0.1:8802")
while True:
message = socket.recv()
print ("message:%s"%message.decode("utf-8"))
(2)worker:
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://127.0.0.1:8801")
while True:
socket.send("测试消息".encode("utf-8"))
print ("发送成功")
time.sleep(2)
(3)server:
import zmq
context = zmq.Context()
receive = context.socket(zmq.PULL)
receive.connect("tcp://127.0.0.1:8801")
sender = context.socket(zmq.PUSH)
sender.connect("tcp://127.0.0.1:8802")
while True:
message = receive.recv()
sender.send(message)
print("正在转发...")
结束语
- 今天到这片文章结束基本的数据通信就这样了,经过一些实际问题应用之后,我的感觉就是这些在实际使用时并不是都用的上,但是经过这些例子,基本的思路和框架就是这样的,然后在实际使用的时候实际需求不一样用的方法也不一样,但运行思路都是一样的!!加油,骚年!!
- 库存都发完了呀,还想接着发,可是没什么整片的内容可发了呀,充电(平时利用课余时间鼓捣鼓捣)一礼拜,工作(发博客)半小时,哈哈哈哈哈哈!