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. reportlab生成pdf

    文档地址:https://www.reportlab.com/docs/reportlab-userguide.pdf 源码地址:https://bitbucket.org/rptlab/report ...

  2. 关于在记事本写入"\n"不显示换行的原因

    Linux系统下直接使用  "\n"  即可换行 windows下需要使用   "\r\n"

  3. 一些ServiceFabric、Orleans、Asp.net Aore的例子

    Sample: ServiceFabric + Orleans + Asp.net Core : Asp.net Core 142 samples for ASP.NET Core 2.1 funda ...

  4. VUE+element tree 实现权限管理

    先写个标题~ ~,后续有空在写 具体功能: 1. 获取所有角色权限列表展示,点击进行编辑,编辑用terr树形结构显示页面结构 2.提交的数据格式(页面名称,角色ID,父节点ID,子节点ID) 3.后面 ...

  5. 【攻略】百度货币识别API,搞定防诈骗的应用小程序

    1.需求及方案: 近两年用外币进行诈骗的案件很多.例如:2015年12月,一安徽诈骗团伙,用不值1角人民币的50印蒂(intis,秘鲁旧货币,1991年发行新货币后已停止流通,目前无货币价值,仅有&q ...

  6. Mask-RCNN:教你如何制作自己的数据集进行像素级的目标检测

    概述 Mask-RCNN,是一个处于像素级别的目标检测手段.目标检测的发展主要历程大概是:RCNN,Fast-RCNN,Fster-RCNN,Darknet,YOLO,YOLOv2,YOLO3(参考目 ...

  7. /data/src/dragon/bidder_mod//src/proto_adapters/dragon_wax_adapter.h:11:对‘vtable for DragonWaxAdapter’未定义的引用

    dragon/bidder_mod/config中增加: $ngx_addon_dir/src/proto_adapters/dragon_wax_adapter.cc \

  8. Oracle将两张表的数据插入第三张表且第三张表中不存在

    1.由于是先查再插所以不能使用insert into table1() values(), 要使用insert into table1() select * table2,不能使用values. 2. ...

  9. c实现哲学家进餐问题。WINDOWS下。

    // 解决哲学家就餐问题// 每个哲学家可用一个线程来模拟.// 设有5个哲学家,5只筷子,每个哲学家吃饭时间为一个随机值,哲学家吃饭后的思考时间也是一个随机值.#include <Window ...

  10. vue教程(二)--过滤器和监视改动功能

    过滤器filter: 1.将数据进行添油加醋的操作. 2.过滤器分两种: 组件内的过滤器(组件内有效). 全局过滤器 组件内:filters:{过滤器名:过滤器函数fn},fn内通过return 返回 ...