Python基础-40-Socket 案例二

前言

基于上一篇的demo,本篇增加一些功能需求

服务端:依旧为发送1~30之间随机的30个数字,以及将客户端返回的结果展示出来

客户端:

1)第一个client计算奇偶性,将结果返回

2)第二个client计算数字的2倍,将结果返回

3)第三个client判断数字是否大于10,将结果返回

 

代码部分

server端

# coding:utf-8
import socket
import random
import time

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("",8000))
sock.listen(5)
# 在1~30之间随机生成的30个数字
random_num = [random.randint(1,30) for i in range(30)]

def send_data(content,address):
    print("%s:%s 连接中"%address)
    for num in random_num:
        # 这里加延迟是以免数据错乱
        time.sleep(1)
        # 服务端发送数据
        content.send("%d".encode()%num)
        # 服务端接收数据
        recv = content.recv(512).decode()
        print(recv)

while True:
    content, address = sock.accept()
    send_data(content,address)

sock.close()

client端一(计算奇偶数)

# coding:utf-8
import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("127.0.0.1",8000))

def recv_data():
    recv = sock.recv(512).decode()
    rec = int(recv)
    if rec % 2 == 0:
        print("%d是偶数"%rec)
        sock.send("%d是偶数".encode()%rec)
    else:
        print("%d是奇数" % rec)
        sock.send("%d是奇数".encode()%rec)

while True:
    try:
        recv_data()   # 直接执行到最后的时候会报错,这里就直接忽略报错信息
    except Exception as e:
        pass

sock.close()

 

client端二(计算两倍值)

# coding:utf-8
import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("127.0.0.1",8000))

def recv_data():
    recv = sock.recv(512).decode()
    rec = int(recv)
    res = rec*2
    print("%d的两倍是%d"%(rec,res))
    sock.send("%d的两倍是%d".encode()%(rec,res))

while True:
    try:
        recv_data()
    except Exception as e:
        pass

sock.close()

 

client端三(判断大于10)

# coding:utf-8
import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("127.0.0.1",8000))

def recv_data():
    recv = sock.recv(512).decode()
    rec = int(recv)
    if rec > 10:
        print("%d大于10"%rec)
        sock.send("%d大于10".encode()%rec)
    else:
        print("%d小于10"%rec)
        sock.send("%d小于10".encode()%rec)

while True:
    try:
        recv_data()
    except Exception as e:
        pass

sock.close()

 

运行

启动服务端后,依次运行client1、client2、client3

 

优化

上面可以实现我们所要的功能了,但是服务端是一个一个去处理客户端请求的,然而我们希望三个计算功能可以同时进行并将结

果返回给服务端。

这样就可以与多线程来结合,让服务端开启多个线程来与客户端交互,同时进行,节约运行时间提高效率

 

修改server端代码,client不变

# coding:utf-8
import socket
import random
import time
import threading

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("",8000))
sock.listen(5)
# 在1~30之间随机生成的30个数字
random_num = [random.randint(1,30) for i in range(30)]

def send_data(content,address):
    print("%s:%s 连接中"%address)
    for num in random_num:
        # 这里加延迟是以免数据错乱
        time.sleep(1)
        # 服务端发送数据
        content.send("%d".encode()%num)
        # 服务端接收数据
        recv = content.recv(512).decode()
        print(recv)

while True:
    content, address = sock.accept()
    t = threading.Thread(target=send_data,args=(content,address))
    t.start()

sock.close()

 

多线程代码执行

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值