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. paxos算法——今生

    Paxos 定义2.1  票:即弱化形式的锁.它具备下面几个性质: 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放. 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最 ...

  2. ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

    在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...

  3. Docker启动一个Centos镜像,在docker中安装ifconfig和ssh

    执行docker search centos 现在最流行的Linux嘛.查了下,排名第一的(STARS最多1882)官方版,就是你了 果断拿下, docker pull centos,看网速了静等拿下 ...

  4. JBuss--为所有JFinal开发者提供二次开发的后台管理系统

    百度搜索:JBuss 或jfinal.com官网https://www.jfinal.com/share/1704 JBuss背景: 2018年6月1日,作者“为道日损”从上海一家xxx公司离职,那时 ...

  5. navicat远程连接mysql10060

    navicat连接mysql时,出现2003-Can't connect to MySql server on '47.106.228.160'(10060"Unknow error&quo ...

  6. POJ 3318:Matrix Multiplication(随机算法)

    http://poj.org/problem?id=3318 题意:问A和B两个矩阵相乘能否等于C. 思路:题目明确说出(n^3)的算法不能过,但是通过各种常数优化还是能过的. 这里的随机算法指的是随 ...

  7. scrapy基础知识之 Scrapy 和 scrapy-redis的区别:

    Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础 ...

  8. 前端动画 wow.js 效果

    让花里胡哨的特效变简单 wow.js动画class介绍 引入css样式以及js插件 <link rel="stylesheet" type="text/css&qu ...

  9. vue源码阅读(二)

    一 一个实例 如果简单了解过些Vue的API的话,肯定会对一下这个特别熟悉,在上一篇里,分析了Vue的核心文件core的index.js构造vue函数执行的流程. 那么下边这个则是实例化构造函数,也就 ...

  10. k8s学习 - 概念 - ReplicaSet

    k8s学习 - 概念 - ReplicaSet 首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别.(官网也是 ...