基于udp套接字写的聊天室

chat_client.py

from socket import *

ADDR = ('127.0.0.1', 8888)
import os, sys
#发送消息
def send_msg(s,name):
    while True:
        try:
            text = input('发言:')
        except KeyboardInterrupt:
            text = 'quit'

        if text.strip() =='quit':
                msg = 'Q '+name
                s.sendto(msg.encode(),ADDR)
                sys.exit('退出聊天室')

        msg = 'C %s %s'%(name,text)
        s.sendto(msg.encode(),ADDR)
def recv_msg(s):
    while True:
        try:
            data,addr = s.recvfrom(4096)
        except KeyboardInterrupt:
            sys.exit()
        #从服务器收到EXIT退出
        if data.decode == 'EXIT':
            sys.exit()
        print(data.decode())


# 客户端启动函数
def main():
    s = socket(AF_INET, SOCK_DGRAM)
    while True:
        name = input('请输入姓名:')
        msg = 'L ' + name
        s.sendto(msg.encode(), ADDR)
        # 接受反馈
        data, addr = s.recvfrom(128)
        if data.decode() == 'OK':
            print('您已进入聊天室')
            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)



if __name__ == '__main__':
    main()


chat_server.py

import os
from socket import *
#服务器地址
ADDR = ('0.0.0.0',8888)
#处理请求
#存储用户
user ={
    
    }
#退出
def do_quit(s,name):
    msg = "%s 退出聊天室"%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_chat(s,name,text):
    msg = '%s: %s'%(name,text)
    for i in user:
        if i  != user:
            s.sendto(msg.encode(),user[i])

#登录
def do_login(s,name,address):
    if name in user or '管理员' in name:
        s.sendto('该用户存在'.encode(),address)
        return
    s.sendto(b'OK',address)#可以进入聊天室
    #通知其他人
    msg = "欢迎'%s'进入聊天室"%name
    for i in user:
        s.sendto(msg.encode(),user[i])
    user[name] = address#插入字典

def do_request(s):
    while True:
        data, addr = s.recvfrom(1024)




        tmp = data.decode().split(' ')
        if tmp[0] == 'L':
            do_login(s,tmp[1],addr)
        elif tmp[0] == 'C':
            text = ' '.join(tmp[2:])
            do_chat(s,tmp[1],text)
        elif tmp[0] =='Q':
            do_quit(s,tmp[1])

        print(data.decode())
#搭建网络
def main():

    "udp服务端"
    s = socket(AF_INET,SOCK_DGRAM)
    s.bind(ADDR)
    pid = os.fork()
    if pid == 0:
        while True:
            msg = input('管理员消息:')
            msg = 'C 管理员'+msg
            s.sendto(msg.encode(),ADDR)
    #请求处理函数
    do_request(s)
if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_42307546/article/details/130768440