前言
基于上一篇的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()
多线程代码执行