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("正在转发...")

结束语

  • 今天到这片文章结束基本的数据通信就这样了,经过一些实际问题应用之后,我的感觉就是这些在实际使用时并不是都用的上,但是经过这些例子,基本的思路和框架就是这样的,然后在实际使用的时候实际需求不一样用的方法也不一样,但运行思路都是一样的!!加油,骚年!!
  • 库存都发完了呀,还想接着发,可是没什么整片的内容可发了呀,充电(平时利用课余时间鼓捣鼓捣)一礼拜,工作(发博客)半小时,哈哈哈哈哈哈!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由学者亻伊宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值