gpt4 book ai didi

python实现简易聊天室(Linux终端)

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 32 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python实现简易聊天室(Linux终端)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下 。

群聊聊天室 。

1.功能:类似qq群聊功能

1.有人进入聊天室需要输入姓名,姓名不能重复 。

2.有人进入聊天室,其他人会受到通知 xxx进入聊天室 。

3.一个人发消息,其他人会受到消息 xxx:xxxxxxxx 。

4.有人退出聊天室,其他人也会收到通知 xxx退出聊天室 。

5.扩展功能:服务端消息公告,服务端发送消息所有人都能收到 管理员消息:xxxxxxxx 。

2.确定技术模型

1.服务端和客户端 。

服务端处理请求,发送管理员消息 客户端执行各种功能 。

2.套接字选择:udp套接字 。

3.消息发送模型:转发 客户端 ~> 服务端 ~> 其他客户端 。

4.存储用户信息:{name:addr} 。

5.处理收发关系:多进程分别处理收发 。

3.注意事项

1.设计封装方案 。

2.写一个功能模块测试一个模块 。

3.注意注释的添加 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#coding =utf-8
'''
chat room
env:python3.5
exc:socket and fork
name:mianmabb
email:mianmabb@163.com
服务端功能:
1.搭建网络通信
2.处理进入聊天室
     * 接收姓名
     * 判断是否允许进入
     * 将结果反馈给客户端
     * 如果不允许则结束,允许则将用户插入数据结构
     * 给其他人发送通知
3.处理聊天
     * 接收消息,判断消息类型,分为L(输入姓名),C(发消息),Q(退出聊天室)
     * 将消息转发
4.处理退出聊天室
5.发送管理员消息
'''
 
from socket import *
from os import *
from sys import *
 
user = {}   #创建空字典用来存储用户的昵称和地址
 
#处理登录
def do_login(s,name,addr):
     if name in user:    #判断昵称是否已经存在
         s.sendto( '该昵称已被占用' .encode(),addr)
         return
     else :    #昵称不存在,则发送约定好的'OK'
         s.sendto(b 'OK' ,addr)
 
     #功能:有人进入聊天室,其他人会收到消息
     msg = '\n   欢迎 %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:
         s.sendto(msg.encode(),user[i])
 
#处理退出
def do_quit(s,name):
     msg = '%s 退出了聊天室' % name
     for i in user:
         if i ! = name:   #给其他人发送该用户退出的消息
             s.sendto(msg.encode(),user[i])
         else :   #给该用户客户端发送约定好的EXIT让父进程退出
             s.sendto(b 'EXIT' ,user[i])
     del user[name]   #删除字典中该用户
 
 
#处理请求
def do_request(s):
     #循环接受所有客户请求
     while True :
         try :
             data,addr = s.recvfrom( 1024 )
         except KeyboardInterrupt:    #捕获父进程直接退出错误
             exit( '服务端退出!' )
 
         # print(data.decode())
         msgList = data.decode().split()   #按空格拆分为列表,方便索引
 
         if msgList[ 0 ] = = 'L' :    #判断消息类型
             do_login(s,msgList[ 1 ],addr)
 
         elif msgList[ 0 ] = = 'C' :
             text = ' ' .join(msgList[ 2 :])  #将消息中可能有的空格加回来
             do_chat(s,msgList[ 1 ],text)
         elif msgList[ 0 ] = = 'Q' :
             do_quit(s,msgList[ 1 ])
 
 
 
def main():
     s = socket(AF_INET,SOCK_DGRAM)
     ADDR = ( '0.0.0.0' , 8888 )
     s.bind(ADDR)
 
     #创建进程
     pid = fork()
     if pid < 0 :
         print ( 'Error' )
     elif pid = = 0 :   #子进程用来发送管理员消息
         while True :
             try :
                 text = input ( '管理员 : ' )
             except KeyboardInterrupt:    #捕获子进程直接退出错误
                 exit()
 
             msg = 'C 管理员 %s' % text
             s.sendto(msg.encode(),ADDR)
 
     else :   #父进程用来处理请求
         do_request(s)
 
 
 
main()

客户端功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'''
1.搭建通信
2.进入聊天室
     * 输入姓名
     * 发送给服务器
     * 接收服务器反馈
     * 不允许则重新输入,允许则进入聊天室
     * 创建新的进程用于消息收发
3.聊天
     * 循环发送消息  消息类型分为L(输入姓名),C(发消息),Q(退出聊天室)
     * 循环接收消息
4.退出聊天室
5.接受管理员消息
'''
 
 
from socket import *
from os import *
from sys import *
 
ADDR = ( '127.0.0.1' , 8888 )    #填写服务端地址
 
#循环发送消息
def send_msg(s,name):
     while True :
         try :
             text = input ()   #客户输入要发送的消息
         except KeyboardInterrupt:   #子进程 防止用户Ctrl+C直接退出
             text = 'quit'
 
         if text.strip() = = 'quit' :    #规定输入quit退出
             msg = 'Q ' + name     #消息类型,姓名
             s.sendto(msg.encode(),ADDR)
             exit( '您已退出聊天室' )
         else :
             msg = 'C %s %s' % (name,text)  #消息类型,姓名,消息
             s.sendto(msg.encode(),ADDR)
 
#循环接收信息
def recv_msg(s):
     while True :
         try :
             data,addr = s.recvfrom( 1024 )
         except KeyboardInterrupt:    #父进程 防止用户Ctrl+C直接退出
             exit()
         if data.decode() = = 'EXIT' :   #当用户退出,无需再收消息,约定EXIT让父进程退出
             exit()   #退出父进程
 
         print (data.decode())
 
 
#创建网络连接
def main():
     s = socket(AF_INET,SOCK_DGRAM)
     while True :
         name = input ( '请输入昵称:' )     #输入姓名
         if not name:
             return
         msg = 'L ' + name
         #发送请求
         s.sendto(msg.encode(),ADDR)
         #等待回复
         data,addr = s.recvfrom( 1024 )
         if data.decode() = = 'OK' :
             print ( '您已进入聊天室' )
             break
         else :   #登录失败
             print (data.decode())  #直接打印服务端的错误信息
        
     #创建进程
     pid = fork()
     if pid < 0 :
         print ( 'Error' )
     elif pid = = 0 :   #子进程发消息
         send_msg(s,name)
     else :      #父进程收消息
         recv_msg(s)
 
 
main()

先运行服务端,再运行客户端 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://blog.csdn.net/mianmabb/article/details/88596190 。

最后此篇关于python实现简易聊天室(Linux终端)的文章就讲到这里了,如果你想了解更多关于python实现简易聊天室(Linux终端)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com