day04:chat-room

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()

程序设计三步骤:

*确定技术点

*结构设计

*功能分析 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值