- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python实现简易聊天室(Linux终端)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下 。
群聊聊天室 。
1.有人进入聊天室需要输入姓名,姓名不能重复 。
2.有人进入聊天室,其他人会受到通知 xxx进入聊天室 。
3.一个人发消息,其他人会受到消息 xxx:xxxxxxxx 。
4.有人退出聊天室,其他人也会收到通知 xxx退出聊天室 。
5.扩展功能:服务端消息公告,服务端发送消息所有人都能收到 管理员消息:xxxxxxxx 。
1.服务端和客户端 。
服务端处理请求,发送管理员消息 客户端执行各种功能 。
2.套接字选择:udp套接字 。
3.消息发送模型:转发 客户端 ~> 服务端 ~> 其他客户端 。
4.存储用户信息:{name:addr} 。
5.处理收发关系:多进程分别处理收发 。
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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!