server:
"""
chat room
env:python3.0
fork() socket()
"""
import os
import sys
from socket import *
# import os, sys
# 服务器地址
ADDR = ("192.168.190.133", 8888)
# 存储用户信息
user = {}
def do_login(s, name, addr):
if name in user or "manager" in name:
s.sendto(b"user already exist", addr)
return
s.sendto(b"OK", addr)
# 通知其他人
msg = "welcome %s" % name
for i in user:
s.sendto(msg.encode(), user[i])
user[name] = addr
def do_chat(s, name, text):
msg = "%s : %s" % (name, text)
for i in user:
if i != name:
s.sendto(msg.encode(), user[i])
# 退出
def do_quit(s, name):
msg = "%s quit" % name
for i in user:
if i != name:
s.sendto(msg.encode(), user[i])
else:
s.sendto(b"EXIT", user[i])
# 删除用户
del user[name]
# 处理客户端请求
def do_request(s):
while 1:
data, addr = s.recvfrom(1024)
if not data:
break
msg = data.decode().split(" ")
# 区分请求类型
if msg[0] == "L":
do_login(s, msg[1], addr)
elif msg[0] == "C":
text = " ".join(msg[2:])
do_chat(s, msg[1], text)
elif msg[0] == "Q":
do_quit(s, msg[1])
# 创建网络连接
def main():
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
p = os.fork()
if p < 0:
sys.exit("error")
elif p == 0:
while 1:
text = input("manager: ")
msg = "C manager %s" % text
s.sendto(msg.encode(), ADDR)
else:
# 处理各种请求
do_request(s)
if __name__ == "__main__":
main()
client:
"""
chat room
env:python3
fork() socket()
"""
import sys
from socket import *
import os
ADDR = ("192.168.190.133", 8888)
# 发消息
def send_msg(s, name):
while 1:
try:
text = input("发消息: ")
except KeyboardInterrupt:
text = "quit"
if text == "quit":
msg = "Q" + name
s.sendto(msg.encode(), ADDR)
sys.exit("quit")
msg = "C %s %s" % (name, text)
s.sendto(msg.encode(), ADDR)
# 收消息
def recv_msg(s):
while 1:
data, addr = s.recvfrom(1024)
# 服务端发送消息让进程退出
if data.decode() == "EXIT":
sys.exit()
print(data.decode())
def join_chat(s):
while 1:
name = input("name: ")
msg = "L " + name
s.sendto(msg.encode(), ADDR)
data, addr = s.recvfrom(1024)
if data.decode() == "OK":
print("join chatting")
break
else:
print(data.decode())
# 创建进程收发消息
pid = os.fork()
if pid < 0:
sys.exit("error")
elif pid == 0:
send_msg(s, name)
else:
recv_msg(s)
# 创建网络连接
def main():
s = socket(AF_INET, SOCK_DGRAM)
join_chat(s)
if __name__ == "__main__":
main()
程序设计三步骤:
*确定技术点
*结构设计
*功能分析