4.设计两个程序要求用消息队列实现简单的聊天功能。
时间: 2024-01-22 12:21:29 浏览: 33
程序1:发送消息
```python
import sys
import time
import random
import string
import json
import zmq
def generate_msg_id():
"""生成随机的消息ID"""
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=16))
def send_msg(socket, content):
"""发送消息"""
msg = {
'id': generate_msg_id(),
'content': content,
'timestamp': int(time.time())
}
socket.send(json.dumps(msg).encode())
if __name__ == '__main__':
if len(sys.argv) < 2:
print(f'Usage: python {sys.argv[0]} <port>')
sys.exit(1)
port = int(sys.argv[1])
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.connect(f'tcp://localhost:{port}')
while True:
content = input('> ')
if not content:
continue
send_msg(socket, content)
```
程序2:接收消息
```python
import sys
import time
import json
import zmq
def recv_msg(socket):
"""接收消息"""
msg = socket.recv()
return json.loads(msg.decode())
if __name__ == '__main__':
if len(sys.argv) < 2:
print(f'Usage: python {sys.argv[0]} <port>')
sys.exit(1)
port = int(sys.argv[1])
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind(f'tcp://*:{port}')
while True:
msg = recv_msg(socket)
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(msg["timestamp"]))} {msg["id"]} {msg["content"]}')
```
这两个程序使用 ZeroMQ 库实现了简单的消息队列聊天功能。程序1将输入的消息发送至消息队列,程序2从消息队列中接收消息并输出。运行两个程序时需要指定相同的端口,例如:
```bash
$ python send_msg.py 5555
$ python recv_msg.py 5555
```
其中 `send_msg.py` 是程序1的文件名,`recv_msg.py` 是程序2的文件名,`5555` 是端口号。