tcp/udp协议代码实现
day 29
一、TCP协议代码实现
1、基础版:
-------------socket.serve------- import socket # 买手机 默认得到是一个TCP的socket server = socket.socket() # 两行代码的效果是一样的 # socket的家族 AF_INET # socket的类型 # SOCK_STREAM 对应的是TCP SOCK_DGRAM 对应的是UDP # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) # 床架基于UDP的socket # server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) server.bind(("127.0.0.1",16888)) # 绑定手机卡 server.listen() # 开始待机 # 得到对方的socket对象与地址 client,addr = server.accept() # 接收通话请求 # 该函数会阻塞 直到有连接请求过来 print("==========") # buffersize 表示应用程序的缓冲区大小 recv其实是 从系统缓冲区读取数据到应用程序 data = client.recv(1024) # 该函数会阻塞 直到操作缓冲区有数据位置 print("==========") -----------------socket.client---------------- import socket client = socket.socket() client.connect(("127.0.0.1",16888)) client.send("hello 服务器".encode("utf-8")) print("===================") data = client.recv(1024) # 该函数会阻塞 直到操作缓冲区有数据位置 print("===================") print("收到服务器:%s" % data.decode("utf-8")) client.close()
2、TPC异常处理版:
---------------socket.serve------------- import socket server = socket.socket() server.bind(("127.0.0.1",8888)) server.listen() client,addr = server.accept() while True: try: data = client.recv(1024) #win状态下客户端异常关闭,会抛出错误 if not data: #如果是linux 不会抛出异常 会死循环收到空的数据包 print("对方已经关闭.....") break print(data.decode("utf-8")) client.send(data.upper()) except ConnectionResetError: print("对方异常关闭连接...") client.close() server.close() ---------------socket.client------------- import socket client = socket.socket() client.connect(("127.0.0.1",8888)) client.send("hello".encode("utf-8")) data = client.recv(1024) print(data.decode("utf-8")) client.close()
3、半连接池:
----------socket.serve-------- import socket server = socket.socket() server.bind(("127.0.0.1",8888)) # 参数可以设置最大的半连接数 最大5个 server.listen(5) import time while True: time.sleep(0.5) server.close() ---------socket.client---------import socket client = socket.socket() client.connect(("127.0.0.1",8888)) while True: client.send(input(">>:").encode("utf-8")) data = client.recv(1024) print(data.decode("utf-8")) client.close()
4、循环收发:
-------------------socket.serve----------- import socket # 买手机 默认得到是一个TCP的socket server = socket.socket() # 两行代码的效果是一样的 # socket的家族 AF_INET # socket的类型 # SOCK_STREAM 对应的是TCP SOCK_DGRAM 对应的是UDP # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) # 创建基于UDP的socket # server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) server.bind(("127.0.0.1",16888)) # 绑定手机卡 server.listen() # 开始待机 # 连接循环 可以不断接受新连接 while True: client, addr = server.accept() # 通讯循环 可以不断的收发数据 while True: try: # 如果是windows 对方强行关闭连接 会抛出异常 # 如果是linux 不会抛出异常 会死循环收到空的数据包 data = client.recv(1024) if not data: client.close() break print("收到客户端发来的数据:%s" % data.decode("utf-8")) client.send(data) except ConnectionResetError: print("客户端强行关闭了连接") client.close() break client.close() #挂断电话 server.close() # 关机 ---------------socket.client-------------- import socket client = socket.socket() client.connect(("127.0.0.1",16888)) while True: msg = input(">:") client.send(msg.encode("utf-8")) data = client.recv(1024) print("收到服务器:%s" % data.decode("utf-8")) client.close()
二、UDP协议代码实现:
------------------socket.serve-------------- import socket # UDP协议 在创建socket是 只有一个类型不同 server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0) server.bind(("127.0.0.1",8888)) while True: data,addr = server.recvfrom(1024) # 阻塞 直到收到数据为止 print("收到来自%s的消息:%s" % (data.decode("utf-8"),addr[0])) # 返回值为 数据 和 对方ip地址 和端口号 server.sendto(data.upper(),addr) print(res) server.close() ---------------socket.client1-------------- import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) while True: data = input(">>:").encode("utf-8") client.sendto(data,("127.0.0.1",8888)) d,addr = client.recvfrom(1024) print(d.decode("utf-8")) client.close() ------------socket.client2-------------- import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) while True: data = input(">>:").encode("utf-8") client.sendto(data,("127.0.0.1",8888)) d,addr = client.recvfrom(1024) print(d.decode("utf-8")) client.close()