多线程练习

一个进程结束的前提为进程内所有线程结束。
结束子线程-->让子线程中的任务结束(就是让run方法结束:结束循环多用添加类属性设置标志作为判断条件)
如果一个线程崩溃,不对其它线程造成影响。

写一个服务器,可以和多个客户端同时通信,并且把接收的消息显示在屏幕上

主程序

import socket
import pygame
from homework.color import Color
from homework.myThread import AcceptThread
from homework.myThread import ConversationThread


def creat_server():
    """创建服务器"""
    server = socket.socket()
    server.bind(('10.7.181.56', 8088))
    server.listen(520)

    # 在一个子线程中去监听
    server_thread = AcceptThread(server)
    server_thread.start()


if __name__ == '__main__':
    # 创建服务器
    creat_server()

    # 准备显示信息的屏幕
    pygame.init()
    screen = pygame.display.set_mode((600, 400))
    screen.fill(Color.white)
    pygame.display.flip()

    # 让屏幕一直存在
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()

        # 获取每条信息,显示在屏幕上
        screen.fill(Color.white)
        for message in ConversationThread.all_message[:]:
            if message.alive:
                # 显示信息
                font = pygame.font.SysFont('Time', 30)
                text = font.render(message.text, True, message.color)
                screen.blit(text, (message.x, message.y))

                # 滚动弹幕
                message.move()
            else:
                ConversationThread.all_message.remove(message)

        pygame.display.update()

    print('退出!!!')

线程类

from threading import Thread
import socket
from random import randint
from homework.color import Color


class Message:
    """文字信息类"""

    def __init__(self, text):
        self.text = text
        self.x = -50
        self.y = randint(20, 380)
        self.color = Color.rand_color()
        self.speed = randint(1, 5)
        self.alive = True

    def move(self):
        self.x += self.speed
        # 越界处理
        if self.x > 600 + 50:
            self.alive = False


class ConversationThread(Thread):
    """处理不同的客户消息"""
    all_message = []
    flag = True

    def __init__(self, conversation: socket.socket, address):
        super().__init__()
        self.conversation = conversation
        self.address = address

    def run(self):
        """服务器与客户端持续通话"""
        while ConversationThread.flag:
            try:
                re_message = self.conversation.recv(1024).decode(encoding='utf-8')
                # 接收到一个消息便创建一个消息对象
                message = Message(re_message)
                # print(re_message)
                # 保存所有的消息
                ConversationThread.all_message.append(message)

                self.conversation.send("".encode())
            except ConnectionResetError:
                print("%s已下线" % self.address)

        print('退出会话线程!')


class AcceptThread(Thread):
    """接收请求的线程类"""
    all_client = []  # 保存所有的用户端

    def __init__(self, server: socket.socket):
        super().__init__()
        self.server = server
        self.flag = True

    def run(self):
        while self.flag:
            conversation, address = self.server.accept()
            print('接收到%s的请求' % address)

            # 接收到一个客户端请求,便创建一个子线程实现会话功能
            t1 = ConversationThread(conversation, address)
            t1.start()
            AcceptThread.all_client.append(t1)

        # 关闭服务器之前,给所有的客户端发送消息
        for tt in AcceptThread.all_client:
            try:
                tt.conversation.send("服务器将关闭,请及时下线!!!".encode())
            except:
                pass
        print('退出请求线程!!')

颜色类

from random import randint


class Color:
    """颜色类"""
    white = 255, 255, 255

    @staticmethod
    def rand_color():
        return randint(0, 255), randint(0, 255), randint(0, 255)

客户端

import socket

if __name__ == '__main__':
    client = socket.socket()
    client.connect(('10.7.181.56', 8088))
    while True:
        # 发送消息
        message = input('>>>')
        client.send(message.encode())

        # 接收消息
        re_message = client.recv(1024).decode(encoding='utf-8')
        print(re_message)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,493评论 19 139
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,806评论 1 32
  • 一、试探 岳昊一动不动地趴在桌上,好似真是醉酒后不省人事的样子。可他心中思绪千转,念的都是一个人——韩欢。他脑海中...
    文刀女尼阅读 1,599评论 0 1
  • 像一部童话 缓缓地荡进心深处的空地 野树开遍了山岗 青草繁密了荒田 不是所有的美丽 是人间浮生一梦 不是所有的霜虹...
    亦之游阅读 3,110评论 0 1
  • 和久别的朋友约好会面,在订餐馆之时,问了一声:“有什么要求?”对方回复:“无辣不欢。”顿时在屏幕这头的我都可以听见...
    单单阅读 4,490评论 8 15