chat-sever / app.py
zhzabcd's picture
Create app.py
b5e065e verified
import socket
import threading
import queue
import json # json.dumps(some)打包 json.loads(some)解包
import os
import os.path
import sys
ipconfig = input("请输入ip地址(推荐127.0.0.1)")
PORTconfig = input("请输入端口(随便编一个4位数,注意在windows系统中端口不能重复)")
port = int(PORTconfig)
IP = ipconfig
PORT = port # 端口
messages = queue.Queue()
users = [] # 0:userName 1:connection
lock = threading.Lock()
def onlines(): # 统计当前在线人员
online = []
for i in range(len(users)):
online.append(users[i][0])
return online
class ChatServer(threading.Thread):
global users, que, lock
def __init__(self): # 构造函数
threading.Thread.__init__(self)
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
os.chdir(sys.path[0])
# 接受来自客户端的用户名,如果用户名为空,使用用户的IP与端口作为用户名。如果用户名出现重复,则在出现的用户名依此加上后缀“2”、“3”、“4”……
def receive(self, conn, addr): # 接收消息
user = conn.recv(1024) # 用户名称
user = user.decode()
if user == '用户名不存在':
user = addr[0] + ':' + str(addr[1])
tag = 1
temp = user
for i in range(len(users)): # 检验重名,则在重名用户后加数字
if users[i][0] == user:
tag = tag + 1
user = temp + str(tag)
users.append((user, conn))
USERS = onlines()
self.Load(USERS,addr)
# 在获取用户名后便会不断地接受用户端发来的消息(即聊天内容),结束后关闭连接。
try:
while True:
message = conn.recv(1024) # 发送消息
message = message.decode()
message = user + ':' + message
self.Load(message,addr)
conn.close()
# 如果用户断开连接,将该用户从用户列表中删除,然后更新用户列表。
except:
j = 0 # 用户断开连接
for man in users:
if man[0] == user:
users.pop(j) # 服务器段删除退出的用户
break
j = j+1
USERS = onlines()
self.Load(USERS,addr)
conn.close()
# 将地址与数据(需发送给客户端)存入messages队列。
def Load(self, data, addr):
lock.acquire()
try:
messages.put((addr, data))
finally:
lock.release()
# 服务端在接受到数据后,会对其进行一些处理然后发送给客户端,如下图,对于聊天内容,服务端直接发送给客户端,而对于用户列表,便由json.dumps处理后发送。
def sendData(self): # 发送数据
while True:
if not messages.empty():
message = messages.get()
if isinstance(message[1], str):
for i in range(len(users)):
data = ' ' + message[1]
users[i][1].send(data.encode())
print(data)
print('\n')
if isinstance(message[1], list):
data = json.dumps(message[1])
for i in range(len(users)):
try:
users[i][1].send(data.encode())
except:
pass
def run(self):
self.s.bind((IP,PORT))
self.s.listen(5)
q = threading.Thread(target=self.sendData)
q.start()
while True:
conn, addr = self.s.accept()
t = threading.Thread(target=self.receive, args=(conn, addr))
t.start()
self.s.close()
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def greet_json():
return {"Sever is running 服务器已启用,协议:TCP "}
if __name__ == '__main__':
cserver = ChatServer()
print("服务器启动完毕,请使用客户端进行连线")
cserver.start()