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. pybind11在Windows下的使用

      Pybind11算是目前最方便的Python调用C++的工具了, 介绍一下在vs2019上写Python的扩展的HelloWorld   1. 去下载pybind11 https://github ...

  2. 六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate)

    六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate) 比较维度\产品 DataPipeline ...

  3. solr 重要的知识点

    1 solr 查询参数说明 常用 ) q - 查询字符串,必须的. ) fl - 指定返回那些字段内容,用逗号或空格分隔多个. ) start - 返回第一条记录在完整找到结果中的偏移位置, 开始,一 ...

  4. PATB 1019. 数字黑洞 (20)

    一个神奇的数字. 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位正整数,如果我 ...

  5. 在CentOS 7上安装Python3

    源码包安装 Python官方没有对Linux打包, 需要下载源码包进行编译. 可以自己下载最新版本的Python, 在Python下载页面, 点击Python3.x.x版本对应的Download, 在 ...

  6. 苹果二代TWS无线耳机AirPods调研

    产品介绍 苹果AirPods二代自从2018年9月份上市以来,到现在将近一年的时间了,据江湖传闻,苹果AirPods的总售卖个数,已经超过了5000W部,这样价格的TWS耳机,能够卖那么多的量,估计也 ...

  7. C++ 洛谷 2014 选课 from_树形DP

    洛谷 2014 选课 没学树形DP的,看一下. 首先要学会多叉树转二叉树. 树有很多种,二叉树是一种人人喜欢的数据结构,简单而且规则.但一般来说,树形动规的题目很少出现二叉树,因此将多叉树转成二叉树就 ...

  8. SPOJ:NPC2016A(数学)

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

  9. EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式

    目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...

  10. MyBatis where、set、trim标签的用法

    <!-- 4.3.1 where用法 <where>标签的作用:如果该便签包含的元素中有返回值,就插入一个where:如果 where后面的字符串是一and或or开头的,就将它们剔除 ...