Python实现网络多人聊天室 - Linux

相关连接:

  Python实现网络多人聊天室 - Windows

  Python实现网络图形化界面多人聊天室

文件结构:

  chatroom
  ├── client.py  # 客户端代码
  ├── language.py  # 语言文件
  ├── server.py  # 服务端代码
  └── settings.py  # 设置文件

  0 directories, 4 files

使用模块:

  • os
  • sys
  • socket
  • select

思路:

  • settings.py,定义HOST、PORT、ADDR、buffersize、language、curuser等变量。
  • server.py,服务器代码,使用select模块select方法实现IO多路复用监听sys.stdin输入以及客户端连接,实现与客户端通信,将从客户端接收到的信息群发给每个客户端。
  • client.py,客户端代码,同样使用IO多路复用同时监听客户端接收信息以及sys.stdin输入信息,实现与服务端的通信,间接实现与其他客户端的群聊。
  • language.py,语言文件,支持中文以及英语。

代码:

settings.py

# settings.py

HOST = '0.0.0.0'      # 主机名
PORT = 5555 # 端口号
buffersize = 1024 # 缓冲大小
ADDR = HOST, PORT # 地址 languages = ['cn', 'en'] # 'cn' -> 中文
language = 'cn' # 'en' -> 英文 curuser = '' # 当前用户

language.py

# language.py

from settings import language

if language == 'en':
administrator = 'Administrator'
txt_administrator_close_chatroom = 'Chatroom closed by Administrator.'
txt_uesr_enter_chatroom = 'entered the chatroom.'
txt_user_quit_chatroom = 'quited the chatroom.'
txt_username = 'username> '
txt_user_already_exists = 'Username already exists!'
txt_connect_to = 'Connected to'
txt_connect_from = 'Connected from'
elif language == 'cn':
administrator = '管理员'
txt_administrator_close_chatroom = '管理员关闭了聊天室。'
txt_uesr_enter_chatroom = '进入了聊天室。'
txt_user_quit_chatroom = '退出了聊天室。'
txt_username = '用户名> '
txt_user_already_exists = '用户名已存在。'
txt_connect_to = '连接到'
txt_connect_from = '连接从'

server.py

# server.py

# 导入系统模块
import os, sys
# 导入网络编程(传输层)模块
from socket import *
# IO多路复用模块
from select import select
# 设置模块
from settings import *
# 语言模块
from language import * def main():
'main 主函数'
server = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 设置端口可立即重用
server.bind(ADDR) # 绑定地址
server.listen() # 监听 # 接收函数
accept(server) def accept(server):
'accept 服务器接受函数' # 使用select模块的select方法实现IO多路复用监听传输
rlist = [server, sys.stdin]
wlist = []
xlist = [] while True:
rs, ws, xs = select(rlist, wlist, xlist) for r in rs:
if r is server:
# 服务器接受客户端连接
conn, addr = server.accept()
# 调用validate函数检查用户名
if validate(conn):
# 将客户端套接字添加到rlist中以监听
rlist.append(conn)
# 如果用户名注册成功
print(txt_connect_from, addr)
else:
conn.close()
elif r is sys.stdin:
# 服务器向所有客户端发送系统(管理员)消息
data = sys.stdin.readline()
if data == '\n':
# 如果服务器输入回车,则退出
for c in rlist[2:]:
c.send(b'\n')
c.close()
server.close()
print(txt_administrator_close_chatroom)
os._exit(0)
else:
# 如果服务器输入正常语句,通知所有客户端
data = administrator + ': ' + data
for c in rlist[2:]:
c.send(data.encode())
else:
# 服务器接受客户端的消息并转发给所有客户端
data = r.recv(buffersize)
if not data:
# 关闭客户端
r.close()
rlist.remove(r)
else:
# 转发信息给其他客户端
print(data.decode(), end='')
for c in rlist[2:]:
if c is not r:
c.send(data) def validate(client):
'检验用户名 validate username'
name = client.recv(buffersize).decode()
# print(name.decode())
# print(users)
if name in users:
client.send(b'Username already exists!')
return False
else:
users.append(name)
client.send(b'Welcome!')
return True if __name__ == '__main__':
# 全局变量,管理用户信息
users = [] # 主函数
main()

client.py

# client.py

# 导入系统模块
import os, sys
# 导入网络编程(传输层)模块
from socket import *
# IO多路复用模块
from select import select
# 设置模块
from settings import *
# 语言模块
from language import * def main():
'main 主函数'
client = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字 # 登录函数
if login(client):
# 连接函数
connect(client) def connect(client):
'connect 客户端连接函数' # 使用select模块的select方法实现IO多路复用监听传输
rlist = [client, sys.stdin]
wlist = []
xlist = [] while True:
rs, ws, xs = select(rlist, wlist, xlist) for r in rs:
if r is client:
# 接受服务器发来的消息
data = client.recv(buffersize)
if data.decode() == '\n':
# 如果消息为回车,聊天室关闭
client.close()
print(txt_administrator_close_chatroom)
os._exit(0)
else:
# 打印接收到的信息
print(data.decode(), end='')
elif r is sys.stdin:
# 发送消息给服务器
data = sys.stdin.readline()
if data == '\n':
# 如果回车,发送退出消息,关闭客户端,退出聊天室
data = curuser + ': ' + txt_user_quit_chatroom + '\n'
client.send(data.encode())
client.close()
os._exit(0)
else:
# 发信息给服务器
data = curuser + ': ' + data
client.send(data.encode()) def login(client):
'登录函数 login'
# 使用全局变量管理用户
# 先让客户端输入姓名
global curuser
curuser = input(txt_username)
# 再连接到服务器,传送用户名以检验
client.connect(ADDR) # 连接到服务器地址
print(txt_connect_to, ADDR)
client.send(curuser.encode())
data = client.recv(buffersize)
if data.decode() == 'Username already exists!':
# 如果用户名已经存在,要求重新输入
print(txt_user_already_exists)
return False
else:
# 发送信息给服务器,告知服务器用户进入聊天室
# -*- 因为监听传输的是sys.stdin.readline(),所以必须在最后添加换行符,以便清除阻塞 -*-
data = curuser + ': ' + txt_uesr_enter_chatroom + '\n'
client.send(data.encode())
return True if __name__ == '__main__':
main()

运行截图:

总结:

  • 在打代码之前,一定要先进行规划,大致写出项目的大概路线。
  • 项目的实现要从最基本的地基开始,像这样一个网络间的多人聊天室的实现必须先从建立服务端和客户端开始,不能反而从表面入手。比如如果要做一个网络多人聊天室的图形化界面应用,绝对不可以先去写图形界面的实现,就算最后实现的图形界面多么好看,如果不能实现网络通信也白干。
  • 对于项目中出错的点,应该多加注释,方便以后阅读,在网上查找到有益的知识,可以把网址复制下来,写进项目文档,方便以后不时之需。

Python实现网络多人聊天室的更多相关文章

  1. Python实现网络多人聊天室 - Windows

    项目名称:多人聊天室项目结构: client.py server.py settings.py项目思路:服务端接收客户端连接,客户端发送信息给服务端,服务端将信息发送给所有客户端.项目实现:主进程负责 ...

  2. Python实现网络图形化界面多人聊天室 - Linux

    网络图形化界面多人聊天室 - Linux Windows版本:https://www.cnblogs.com/noonjuan/p/12078524.html 在Python实现网络多人聊天室基础上, ...

  3. Python实现网络图形化界面多人聊天室 - Windows

    Python实现网络图形化界面多人聊天室 - Windows 项目名称:网络多人聊天室图形界面版本 项目思路: server.py 服务端文件,主进程中,创建图形化界面,询问地址(主机名,端口),点击 ...

  4. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  5. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  6. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  7. 使用Go语言+Protobuf协议完成一个多人聊天室

    软件环境:Goland Github地址 一.目的 之前用纯逻辑垒完了一个可登入登出的在线多人聊天室(代码仓库地址),这次学习了Protobuf协议,于是想试着更新下聊天室的版本. 主要目的是为了掌握 ...

  8. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  9. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

随机推荐

  1. JAVA复习笔记01

    学了一学期的JAVA,临近期末,整理了一些JAVA考试中需要掌握的点,记录在这里. 1.编译多个JAVA文件,运行程序 (1) javac .java .java java Main (2) java ...

  2. denied: requested access to the resource is denied

    1.vim  /etc/docker/daemon.json    增加一个daemon.json文件 { "insecure-registries":["192.168 ...

  3. golang开发:类库篇(二) Redis连接池的使用

    为什么要使用连接池 一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源.所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接 ...

  4. 100天搞定机器学习|Day7 K-NN

    最近事情无比之多,换了工作.组队参加了一个比赛.和朋友搞了一些小项目,公号荒废许久.坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列.想要继续做这个是因为,一方面在具 ...

  5. BZOJ 1061:志愿者招募(单纯型)

    题目链接 题意 中文题意. 思路 单纯型模板题. 单纯型用来解决线性规划问题. 留坑待填. 算法思路 好长 模板 论文 卿学姐视频 #include <bits/stdc++.h> usi ...

  6. SPOJ:NPC2016A(数学)

    http://www.spoj.com/problems/NPC2016A/en/ 题意:在一个n*n的平面里面,初始在(x,y)需要碰到每条边一次,然后返回(x,y),问最短路径是多长. 思路:像样 ...

  7. linux命令积累

    lsof -i: //根据端口号查相关信息 //杀进程 ps -ef|grep appName //根据进程名称查找相关信息 grep -r "关键词" 目录 //在制定目录下根据 ...

  8. Linux命令学习-history命令

    Linux中,history命令的作用是显示历史记录和执行过的命令. 查看历史所有命令执行记录 history 查看最近的13条历史执行命令 history 13 执行历史记录中,序号为123的命令 ...

  9. Web前端——JavaScript扩展补充

    JS补充 document也是windows的一个子对象 a标签点击事件 要想设置点击a标签,执行某种方法,推荐在a标签的herf属性使用JavaScript伪协议,实现点击之后执行的js方法,而不是 ...

  10. 修改Windows10的host文件。

    一.Windows10中host地址. c:\windows\system32\drivers\etc\hosts 其他系统中的位置. Windows操作系统(Windows XP/7/8/10): ...