Python_Weekend_17 多线程 、计算机网络 服务器和客户端

多线程、计算机网络

多线程存钱:

import  time
from threading import Thread , Lock

class Account(object):

    def __init__(self):
        self.__balance = 0
        self.__lock = Lock()

    @property
    def balance(self):
        return self.__balance

    def deposit(self,money):
        # 当多个线程同时访问一个资源的时候,就有可能因为竞争资源的状态导致错误
        # 被多个线程访问的资源我们通常称之为临界资源 对资源的访问需要加上保护
        if money > 0 :
            self.__lock.acquire()          # 获得锁
            try:
                new_balance = self.__balance + money
                time.sleep(0.01)
                self.__balance = new_balance
            finally:
                self.__lock.release()         # 解锁


class AddMoneyThread(Thread)  :

    def __init__(self,account):
        super().__init__()
        self._account = account

    def run(self):
        self._account.deposit(1)     # 加钱

def main():
    account = Account()       # 银行账号
    tlist= []
    for _ in range(100):
        t = AddMoneyThread(account)
        tlist.append(t)
        t.start()

    for t in tlist:
        t.join()
    print('账户余额:%d元'% account.balance)

if __name__ == '__main__':
    main()

随机生成五个不同颜色的小方块(汽车)从起点跑到终点:

from pygame.threads import Thread
import  time

class Color(object):
    BLACK = (0,0,0)
    WHITE = (255,255,255)
    GTAY = (242,242,242)

    @staticmethod         # 随机颜色
    def random_color():
        r = randint(0,255)
        g =randint(0,255)
        b =randint(0,255)
        return  r,g,b

class Car(object):

    def __init__(self,x,y,color):     # 车的坐标颜色
        self._x = x
        self._y = y
        self._color = color

    def move(self):
        if self._x + 80 < 950:          # 车的终点线停止设置
            self._x += randint(1,10)     # 车的速度随机

    def draw(self,screen):
        pygame.draw.rect(screen,self._color,(self._x,self._y,80,40),0)  # 画车大小




def main():

    class BackgrondTask(Thread):    # 线程

        def run(self):          # 每隔50毫秒车跑起来
            while True:
                screen.fill(Color.GTAY)
                pygame.draw.line(screen, Color.BLACK, (130, 0), (130, 600), 4)  # 起点线
                pygame.draw.line(screen, Color.BLACK, (950, 0), (950, 600), 4)  # 终点线
                for car in cars:
                    car.draw(screen)
                pygame.display.flip()
                time.sleep(0.005)
                for car in cars:                # 车跑
                    car.move()
    cars =[]
    for index in range(5):
        temp = Car(50,50+110*index,Color.random_color())
        cars.append(temp)
    pygame.init()
    screen = pygame.display.set_mode((1000,600))
    BackgrondTask(daemon = True).start()                     # 创建线程  daemon S是守护线程
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running= False
    pygame.quit()


if __name__ == '__main__':
    main()

自己做一个简单的服务器:

#  计算机网络:多台独立自主的计算机聚集到一起     共享资源通信数据交换
# HTTP - Hyper -Text Transfer Protocol
# SMTP - Simple Mall Transfer Protocol
# POP3 - Post Offce Protocol version 3
# IMAP - Internet Mail Access Protocol
#TeInet
#FTP

# TCP/IP

#
# cdm 输入ipconfig  可以查看ip地址  寻址
#
# cmd 命令窗口打开 netsat -na  命令窗口查看哪些端口被占用
#
# cmd 命令窗口打开 telnet 加上Ip  端口  连接服务器


from socket import socket ,AF_INET, SOCK_STREAM  # 套接字
import  datetime

def main():
    # 创建一个基于TCP协议的套接字对象
    # 因为我们做的是应用级的产品或服务所以可以利用现有的传输服务来实现数据传输
    server = socket()                           # 创建一个套接字            # socket默认里面是(AF_INET,SOCK_STREAM)         ## 这是类    AF_INET是系统固定参数
    # 绑定IP地址(网络上主机的身份标识)和端口(用来区分不同服务的IP地址的扩展)      端口不是设备
    server.bind(('10.7.189.53',6799))          #  绑定ip地址和网卡  端口号   端口号可以区分到底访问的是那个服务,端口号可以从0到65365 2的16次方减一个
                                                #  尽量用1024以后的端口   127.0.0.1  或localhost 本地ip
                                                # 10.7.189.53 自己电脑ip
    # 开始监听客户端的连接
    server.listen(512)     # 限制服务器最大连接数量  512是经验值 很多服务器的数据2的9次方 所以512比较合适
    print('服务器已经启动正在监听...')
    while True:
        # 通过accept方法接收客户端的连接
        # accpet方法是一个阻塞式的方法 如果没有客户端练上来
        # 那么accept 方法就会让代码柱塞 直到有客户端连接成功才返回
        # accpet方法返回一个元组 元组中的第一个值是代表客户端的对象
        # 元组中的第二个值又是一个元组 其中有客户端的IP地址和客户端的端口
        client, addr = server.accept()              ##连上来客户收到信息\
        # print(client)
        print(addr,'连接成功')
        now_time = str(datetime.datetime.now())
        # print(datetime.datetime.now())
        client.send(now_time.encode('utf - 8'))  #打印现在的时间给连接服务器的人
        client.close()


if __name__ == '__main__':
    main()

客户端:

from socket import socket


def main():
    client = socket()
    client.connect(('10.7.189.53',6750))

    while True:
        data = client.recv(1024)  # 接收缓冲区  理论上越大越好  但是越大越占内存
        print(data.decode('utf-8'))  # decode二进制解码
        talk = input('请输入聊天内容2:')
        if data == 0 :
            break
        talk2 = client.send(talk.encode('utf - 8'))




if __name__ == '__main__':
    main()

然后改善了一下可以服务器和客户端可以相互发消息:

##  两人做 可以相互聊天的 服务器
from socket import socket ,AF_INET, SOCK_STREAM  # 套接字

def main():
    server = socket()
    server.bind(('10.7.189.53',6750))
    server.listen(512)
    print('Come on ! 我们来聊天吧!服务器已经启动正在监听...')
    client,addr = server.accept()
    print(addr,'连接成功')
    while True:
        talk = input('请输入聊天内容1:')
        client.send(talk.encode('utf - 8'))
        data = client.recv(1024)
        print( data.decode('utf-8'))
    client.close()


if __name__ == '__main__':
    main()
from socket import socket


def main():
    client = socket()
    client.connect(('10.7.189.53',6750))

    while True:
        data = client.recv(1024)  # 接收缓冲区  理论上越大越好  但是越大越占内存
        print(data.decode('utf-8'))  # decode二进制解码
        talk = input('请输入聊天内容2:')
        if data == 0 :
            break
        talk2 = client.send(talk.encode('utf - 8'))




if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/weixin_41782332/article/details/79645894