服务端
server.py
"""__author__zhangdong__"""
"""
注意:
1.想要结束一个进程就是让它里面的所有的线程都结束
2.想要关闭一个子线程,就是想方设法让子线程中的任务结束(就是让run方法结束)
3.一个线程崩溃(发生异常),不会影响其他线程
"""
import pygame
import socket
from color import Color
import myThread
def crest_server():
"""创建服务器"""
server = socket.socket()
server.bind(('10.7.181.97', 8081))
server.listen(512)
#在一个子线程中监听客户端的请求
server_thread = myThread.Server_Thread(server)
server_thread.start()
if __name__ == '__main__':
crest_server()
#准备显示信息的屏幕
pygame.init()
screen = pygame.display.set_mode((600,400))
screen.fill(Color.white)
pygame.display.set_caption('良心主播')
pygame.display.flip()
print(pygame.font.get_fonts())
#让屏幕可以一直存在
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
#获取每条信息显示在屏幕上
screen.fill(Color.white)
for message in myThread.ConversationThread.all_message[:]:
if message.alive:
#显示信息
pygame.time.delay(30)
#方正兰亭超细黑简体
font = pygame.font.SysFont('stsong', 40)
text = font.render(message.text, True,message.color)
screen.blit(text,(message.x,message.y))
#动起来
message.move()
else:
myThread.ConversationThread.all_message.remove(message)
pygame.display.update()
my_Thread.py
"""__author__zhangdong__"""
from threading import Thread
import socket
from random import randint
from color import Color
class Message:
"""文字信息类"""
def __init__(self,text):
self.text = text
self.x = -100
self.y = randint(0,380)
self.color = Color.rand_color()
self.speed = randint(2,5)
self.alive = True
def move(self):
self.x += self.speed
#越界处理
if self.x> 600+50:
self.alive = False
class ConversationThread(Thread):
all_message = []
"""处理不同的客户端信息"""
def __init__(self,conversation:socket.socket):
super().__init__()
self.conversation = conversation
def run(self):
"""让服务器和客户端一直保持通话"""
while True:
try:
self.conversation.send('欢迎来到直播间'.encode())
re_message = self.conversation.recv(1024).decode(encoding='utf-8')
#接收到一条消息就创建一个消息对象
message = Message(re_message)
#保存所有的消息
ConversationThread.all_message.append(message)
except ConnectionResetError:
break
class Server_Thread(Thread):
"""接收请求的线程类"""
def __init__(self,server:socket.socket):
super().__init__()
self.server = server
def run(self):
"""不断接受客户端请求"""
while True:
conversation,address = self.server.accept()
print('接收到客户端的请求')
#来了一个客户端请求就给他创建一个线程来处理对应的消息
t1 = ConversationThread(conversation)
t1.start()
if __name__ == '__main__':
pass
客户端
client.py
"""__author__zhangdong__"""
import socket
if __name__ == '__main__':
client = socket.socket()
client.connect(('10.7.181.97',8081))
while True:
print(client.recv(1024).decode(encoding='utf-8'))
message = input('>>>')
client.send(message.encode())