发布于2019-08-05 11:09 阅读(733) 评论(0) 点赞(3) 收藏(1)
文件结构:
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()
运行截图:
总结:
作者:紫薇
链接:https://www.pythonheidong.com/blog/article/4229/88b4c36304cade499fcf/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!