需要经常练习的代码
使用套接字进行
# 使用套接字实现多用户连接服务端实现通信
# 服务端
import socket # socket是一个套接字,可以写一套C/S架构,简单的说就是可以写客户端与服务端。
server = socket.socket()
server.bind(('127.0.0.2',9000))
server.listen(5) # 半连接池
while True:
conn, addr = server.accept() # 进行监听
print(addr)
while True:
try:
# 接听消息
date = conn.recv(1024)
# 对消息进行判断
if date == 'q':
break
if len(date) == 0:
continue
print(date.decode('utf-8'))
conn.send(date)
except Exception as e:
print(e)
break
# 客户端
import socket
client = socket.socket()
client.connect(('127.0.0.2',9000)) # 进行三次握手
#开始向服务端发送消息
while True:
# 发送
send_msg = input('请输入》》')
client.send(send_msg.encode('utf-8')) # 发送的时候进行转码
# 接收
date = client.recv(1024)
print(date.decode('utf-8'))
# 总结:这种写法只能同时使一个用户来连接服务端进行使用,当一个用户结束之后,另一个用户才能进行使用。
基于TCP实现服务端并发执行
# TCP服务端使用线程实现并发
'''
服务端的工作:
1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
2.24小时不间断提供服务
3.实现并发
'''
# 服务端
import socket # socket是一个套接字,可以写一套C/S架构,简单的说就是可以写客户端与服务端。
from threading import Thread
server = socket.socket()
server.bind(('127.0.0.2',9000))
server.listen(5) # 半连接池
print('启动都无端...')
def task(conn):
while True:
try:
# 接听消息
date = conn.recv(1024)
# 对消息进行判断
if date == 'q':
break
if len(date) == 0:
continue
print(date.decode('utf-8'))
conn.send(date)
except Exception as e:
print(e)
break
conn.close()
while True:
conn, addr = server.accept() # 进行监听
print(addr)
t = Thread(target=task,args=(conn,))
t.start()
# 客户端
import socket
client = socket.socket()
client.connect(('127.0.0.2',9000)) # 进行三次握手
#开始向服务端发送消息
while True:
# 发送
send_msg = input('请输入》》')
client.send(send_msg.encode('utf-8')) # 发送的时候进行转码
# 接收
date = client.recv(1024)
print(date.decode('utf-8'))
# 总结:这样实现的好处是每个用户都可以同时访问服务端,不需要等待前一个结束之后才能使用。监听到一个客户端的时候,就产生一个新的线程,基于线程的并发特性,可以使客户端在每次遇到IO的时候都进行切换,并执行下一个线程的任务。
TCP服务端实现单线程下实现并发
# 服务端单线程实现并发
'''
服务端的工作:
1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
2.24小时不间断提供服务
3.实现并发
'''
TCP单线程实现并发
# 在单线程下实现并发,使用的方式协程
# TCP服务端使用线程实现并发
'''
服务端的工作:
1.能同时接收每个客户端的请求,不需要一个用户停止,下一个用户才能使用
2.24小时不间断提供服务
3.实现并发
'''
# 服务端
from gevent import monkey
monkey.patch_all() # 检测IO
import socket
import time
from gevent import spawn
server = socket.socket()
server.bind(
('127.0.0.1', 9527)
)
server.listen(5)
print('启动服务端...')
# 线程任务,执行接收客户端消息与发送消息给客户端
def working(conn):
while True:
try:
data = conn.recv(1024).decode('utf-8')
if len(data) == 0:
break
print(data)
# time.sleep(1)
send_data = data.upper().encode('utf-8')
conn.send(send_data)
except Exception as e:
print(e)
break
conn.close()
def server2():
while True:
conn, addr = server.accept()
spawn(working, conn)
if __name__ == '__main__':
s1 = spawn(server2)
s1.join()
# 客户端
import socket
from threading import Thread,
current_thread
def client():
client = socket.socket()
client.connect(
('127.0.0.1', 9527)
)
print('启动客户端...')
number = 0
while True:
send_data = f'{current_thread().name} {number}'
client.send(send_data.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
number += 1
# 模拟了300个用户并发去访问服务端
for i in range(300):
t = Thread(target=client)
t.start()