学习Python的日子 Python高级(9)

Python高级
回顾
udp:
1.使用udp进行通话:socket(AF_INET,SOCK_DGRAM)
接收:recvfrom()
发送:sendto()
2.多线程的:
socket对象
线程---->socket.sendto()  ---> 聊多句
线程---->sock.recvfrom()  ---> 收多句
3.udp广播:
屏幕广播
飞秋


tcp:
网络通信
集线器 hub
交换机 switch
路由器 router


IMCP  ARP(物理地址)


server  服务器
域名  ---》 域名解析器 ----》IP  ----》


tcp:
三次握手
四次挥手
tcp编程:
服务端


客户端
基础版
客户端
from socket import *
import time
from threading import Thread


client_socket = socket(AF_INET, SOCK_STREAM)


client_socket.connect(("127.0.0.1", 8089))




# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg = content.decode("utf-8")
print(msg)
if msg == "bye" or len(msg)==0:
break


# # 关闭new_socket
# new_socket.close()




def send_msg(new_socket):  # socket对象
while True:
msg = input("请输入:")
new_socket.send(msg.encode("utf-8"))




# 定义子线程    如果两个线程共用一个socket,不会受到影响
Thread(target=recv_msg, args=(client_socket,)).start()
Thread(target=send_msg, args=(client_socket,)).start()


服务器
from socket import *
import time
# 1.创建对象
from threading import Thread


server_socket = socket(AF_INET, SOCK_STREAM)
# 设置目的   复用  OSError: [Errno 48]   Address already in use
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
# 2. 8089
server_socket.bind(("", 8089))
# 3.设置监听
server_socket.listen(5)




# 定义子线程的任务
def recv_msg(new_socket):
while True:
content = new_socket.recv(1024)
msg=content.decode("utf-8")
print(msg)
if len(msg) ==0:
break




def send_msg(new_socket):
while True:
msg=input("服务端输入:")
new_socket.send(msg.encode("utf-8"))


# 4.
def main():
while True:
# 产生新的socket
new_socket, new_addr = server_socket.accept()
print("===========>新的客户端访问:",new_addr)


# 定义子线程
Thread(target=recv_msg, args=(new_socket,)).start()
Thread(target=send_msg, args=(new_socket,)).start()


if __name__ == "__main__":
main()


单进程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR


# 创建tcp服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)


while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
try:
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break
finally:
new_socket.close()
print("关闭%s客户端" % (str(new_address)))


# 关闭tcp服务器套接字
server_socket.close()


多线程版服务器
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR


# 创建tcp服务器套接字
from threading import Thread


server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)




def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break


def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Thread(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))






if __name__=="__main__":
main()


多进程版服务器
from multiprocessing import Process
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR


# 创建tcp服务器套接字
from threading import Thread


server_socket = socket(AF_INET, SOCK_STREAM)
# 绑定端口
server_socket.bind(("", 9999))
# 设置正常情况退出的服务器下,端口可以重用
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 设置监听,变为主动监听
server_socket.listen(5)




def recv_msg(new_socket,new_address):
while True:
recv_data = new_socket.recv(1024)
# 当有客户端关闭后,recv解除阻塞,并且返回长度为0
if len(recv_data) > 0:
recv_content = recv_data.decode("gb2312")
print("收到:%s的信息是:%s" % (str(new_address), recv_content))
new_socket.send("thank you!".encode("gb2312"))
else:
print("客户端%s已经关闭" % (str(new_address)))
break


def main():
try:
while True:
# 等待客户端的链接,返回新的socket和地址
new_socket, new_address = server_socket.accept()
# 接收数据,并且发送数据
Process(target=recv_msg, args=(new_socket,new_address)).start()
finally:
# 关闭tcp服务器套接字
server_socket.close()
print("关闭%s客户端" % (str(new_address)))






if __name__=="__main__":
main()


单进程非阻塞
客户端
from socket import *
from threading import Thread


client_socket = socket(AF_INET, SOCK_STREAM)


client_socket.connect(("127.0.0.1", 9999))


client_socket.send("hello".encode("utf-8"))


client_socket.close()
服务器
from socket import *


server_socket=socket(AF_INET,SOCK_STREAM)


server_socket.bind(("",10000))


server_socket.listen(5)


server_socket.setblocking(False)


while True:
try:
# print("-----11111-----")
# 1. 报错  Resource temporarily unavailable   因为设置成非阻塞
new_socket,new_addr=server_socket.accept()
print("------22222----",new_addr)


except:
# print("----33333----")
pass


select
import select
import sys


# 标准的输入
f=sys.stdin   # r 读取键盘信息


print(f)
print(f.fileno())




f=sys.stdout   # w  输出  到控制台


print(f)
print(f.fileno())




f=sys.stderr   # w  报错输出


print(f)
print(f.fileno())


f1=open("./aa.py","r")  # 向文件中写入信息
print(f1)
print(f1.fileno())


f1=open("./bb.py","w")  # 向文件中写入信息
print(f1)
print(f1.fileno())
echo客户端
from socket import *
from threading import Thread


client_socket = socket(AF_INET, SOCK_STREAM)


client_socket.connect(("192.168.28.52", 9999))


client_socket.send("hello".encode("utf-8"))
while True:
msg = client_socket.recv(1024)
print(msg.decode("utf-8"))


client_socket.close()


echo服务器
from socket import *
import select
import sys


server_socket = socket(AF_INET, SOCK_STREAM)


server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


server_socket.bind(("", 9999))


server_socket.listen(5)
# 客户列表
socket_list = [server_socket]
try:
while True:
print("-----11111----")


read_list, write_list, error_list = select.select(socket_list, [], socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket)  # [server_socket,new_socket]
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg)  # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()


扩展
from socket import *
import select
import sys


server_socket = socket(AF_INET, SOCK_STREAM)


server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


server_socket.bind(("", 9999))


server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin]     #   读取的列表


writeable_list=[]


try:
while True:
print("-----11111----")


read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
# print(read_list, write_list, error_list)
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket)  # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg)  # 发送同样的信息
except:
print("----->有异常了")
finally:
server_socket.close()


扩展写部分
from socket import *
import select
import sys


server_socket = socket(AF_INET, SOCK_STREAM)


server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


server_socket.bind(("", 9999))


server_socket.listen(5)
# 客户列表
socket_list = [server_socket,sys.stdin]     #   读取的列表
#写列表
writeable_list=[]


try:
while True:
print("-----11111----")


read_list, write_list, error_list = select.select(socket_list, writeable_list, socket_list)
print(read_list,write_list,error_list)
# 遍历写列表
for sock in write_list:
print("========>write")
sock.send("hello world".encode("utf-8"))


# 遍历可读列表
for sock in read_list:
if sock==server_socket:
print("sock==server_socket")
new_socket,new_addr=server_socket.accept()
# 将new_socket添加到列表、
socket_list.append(new_socket)  # [server_socket,new_socket]
elif sock==sys.stdin:
msg=sys.stdin.readline()
print("键盘输入的内容:",msg)
else:
recv_msg=sock.recv(1024)
if len(recv_msg)==0:
print("客户端断开了")
socket_list.remove(sock)
elif len(recv_msg)>0:
print("收到消息:",recv_msg.decode("utf-8"))
# 回声
sock.send(recv_msg)  # 发送同样的信息
writeable_list.append(sock)


except:
print("----->有异常了")
finally:
server_socket.close()


epoll
1.select  ---> 32:1024 | 64: 2048    --->轮询
2.poll ---》提升版 select  ---》提升了个数,(个数没有限制的了)
3.epoll ---> linux window  mac(kqueue)
事件触发机制
文件描述符   事件  ---》callback
服务器
from select import *
from socket import *


server_socket=socket(AF_INET,SOCK_STREAM)


server_socket.bind(("",9999))


server_socket.listen(5)


# 创建epoll对象
epol=epoll()


# 注册事件
epol.register(server_socket.fileno(),EPOLLIN|EPOLLET)


# 装socket的列表
socket_list={}


#装socket的地址
socket_addr={}


while True:
print("-------1111111-------")
epoll_list=epol.poll()  # [(fd,事件),(),(),()]
print("--------22222------")


for fd,event in epoll_list:
# 有新的连接
if fd==server_socket.fileno():
new_socket,new_addr=server_socket.accept()
#\往子典中添加数据
socket_list[new_socket.fileno()]=new_socket
socket_addr[new_socket.fileno()]=new_addr
# 注册事件
epol.register(new_socket.fileno(),EPOLLIN|EPOLLET)
elif event==EPOLLIN:
print("哈哈哈!收到数据了")
new_socket=socket_list[fd]
new_addr=socket_addr[fd]


# 读取数据
content=new_socket.recv(1024)
if len(content)>0:
print("收到数据是:",content.decode("utf-8"))
else:
epol.unregister(fd)  # 取消注册
new_socket.close()
print(new_addr,"下线了....")




协程
生成器
import time
def a():
for i in range(3):
print("A")
yield
time.sleep(0.5)




def b(obj):
for i in range(3):
print("B")
next(obj)
time.sleep(0.5)


a1=a()
b(a1)
greenlet
from greenlet import greenlet


import time


def a():
for i in range(3):
print("A")
gr2.switch()
time.sleep(0.5)




def b():
for i in range(3):
print("B")
gr3.switch()
time.sleep(0.5)


def c():
for i in range(3):
print("c")
gr1.switch()
time.sleep(0.5)




def main():
gr1.switch()# 类似执行函数




if __name__=="__main__":
gr1=greenlet(a)
gr2=greenlet(b)
gr3=greenlet(c)
main()


gevent
import gevent
# 看谁sleep ,睡觉的就要给另外一个任务让步


def task1(n):
print("--->",n)
for i in range(10):
print("-----------AAAAA------------")
gevent.sleep(1)


def task2(n):
for i in range(10):
print("-----BBBBBB------")
gevent.sleep(1)


def main():
# 创建gevent对象
g1=gevent.spawn(task1,5)
g2=gevent.spawn(task2,5)


g1.join()
g2.join()




if __name__=="__main__":
main()

猜你喜欢

转载自blog.csdn.net/qq_42240071/article/details/80447769
今日推荐