鹰王的女人,东海龙网同花顺,香逸湾别墅
文件结构:
chatroom
├── client.py # 客户端代码
├── language.py # 语言文件
├── server.py # 服务端代码
└── settings.py # 设置文件
0 directories, 4 files
使用模块:
思路:
代码:
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爬虫:Request Payload和Form Data的简单区别说明
浅谈Python中threading join和setDaemon用法及区别说明
Python3-异步进程回调函数(callback())介绍
python继承threading.Thread实现有返回值的子类实例
Python中使用threading.Event协调线程的运行详解
网友评论