网络编程socket (套接字tcp与udp得到简单)推演
半连接池==就是待客厅
基于tcp简单使用(有bug 向后推演)
# x='你好 '.encode('utf8') #转换为bytes类型 # print(type(x)) # print(x.decode('utf8')) # 购买手机 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数 是基于tcp(流)或者是基于udp(报)传输协议 # 传输地址(拨通服务电话) phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器 # 发送信息(通信) phone.send('你好啊涛哥'.encode('utf8'))#传输的bytes类型 # 接收信息 data=phone.recv(1024) print(data.decode('utf8')) #手机关机(必须回收资源的操作) phone.close()
# import socket # # 1,打买手机 (实例化) # phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#数据流=>tcp协议 SOCK_DGRAM=》udb数据报 # #2 绑定手机卡 私网ip毫无意义(局域网通信) (测试 回环 127.0.0.1) # phone.bind(('127.0.0.1',8080))#0-65535端口, 1024以前的都被系统保留使用(慎用 ) # # 3.开机(监听状态) # phone.listen(5)#backlog=? 半连接池大小 # #4.等待电话请求 # conn,client_addr=phone.accept() # # data=conn.recv(1024) import socket # 购买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定手机卡 phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定 # 开机 phone.listen(5)#定义半连接池 大小 # 接收信息 conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口 # 接收信息 data=conn.recv(1024)#接收bytse类型的最大限度 print(data.decode('utf8'))#解码输出客户端传来的数据 conn.send('我已近接收到你发出的信息%s'.encode('utf8')%(data.upper()))#只能输出传达bytes类型 #(必选)关闭发送管道解决系统占用问题 conn.close() #(可选)关闭接收手机发出的信息 # phone.close()
基于tcp循环通信(修正1)
# 购买手机 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数 是基于tcp(流)或者是基于udp(报)传输协议 # 传输地址(拨通服务电话) phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器 循环在这上面会一直刷新所以接收不到值 while True: msg=input('请输入您需要发送的信息>>>: ').strip() if len(msg)==0:continue # 发送信息(通信) phone.send(msg.encode('utf8'))#传输的bytes类型 seng是给自己缓存发东西并不是一一对应的 recv也是在自己内存中 要数据 # 接收信息 data=phone.recv(1024) print(data.decode('utf8')) #手机关机(必须回收资源的操作) phone.close()
import socket # 购买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定手机卡 phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定 # 开机 phone.listen(5)#定义半连接池 大小 存放链接 # 接收信息 conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口 while True: # 接收信息 try: # 异常处理 data=conn.recv(1024)#接收bytse类型的最大限度 except Exception : break print(data.decode('utf8'))#解码输出客户端传来的数据 conn.send(data.upper())#上面已近解码 #(必选)关闭发送管道解决系统占用问题 conn.close() #(可选)关闭接收手机发出的信息 phone.close()
基于tcp链接循环通信(修正2)
# 购买手机 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#传输协议是通过网络的家族协议,需要参数 是基于tcp(流)或者是基于udp(报)传输协议 # 传输地址(拨通服务电话) phone.connect(('127.0.0.1',8080))#传输给ip地址端口给服务器 循环在这上面会一直刷新所以接收不到值 while True: msg=input('请输入您需要发送的信息>>>: ').strip() if len(msg)==0:continue # 发送信息(通信) phone.send(msg.encode('utf8'))#传输的bytes类型 seng是给自己缓存发东西并不是一一对应的 recv也是在自己内存中 要数据 # 接收信息 data=phone.recv(1024) print(data.decode('utf8')) #手机关机(必须回收资源的操作) phone.close()
# 服务端特点 # 一直提供服务 # 并发的 提供服务 import socket # 购买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定手机卡 phone.bind(('127.0.0.1',8080))#需要IP 和端口 绑定 # 开机 phone.listen(5)#定义半连接池 大小 存放链接 # 链接循环(解决上一次管道关闭后再 接收新用户管道连接) #秉承着服务端一直提供服务 while True: # 接收信息 conn,client=phone.accept()#第一个是建立的的管道 后一个是客户端ip和端口 # 通信:收\发信息 while True: # 接收信息 try: # 管道通讯非正常中短 win中会出现异常所以不能使用if 只能使用异常处理 data=conn.recv(1024)#接收bytse类型的最大限度 if len(data)==0:break #管道通讯非正常中短 在unix中会无限循环下去 except Exception : break print(data.decode('utf8'))#解码输出客户端传来的数据 conn.send(data.upper())#上面已近解码 #(必选)关闭发送管道解决系统占用问题 conn.close() #(可选)关闭接收手机发出的信息 (鸡肋) phone.close()
基于udp的通信
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#udp数据报 while True: msg=input('请输入》》》:').strip() client.sendto(msg.encode('utf8'),('127.0.0.1',8080)) #需要知道公网地址 data,sever_addr=client.recvfrom(1024) print(data.decode('utf8')) client.close()
import socket serve=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#udp数据报 是收一个集装箱(数据报就看起来是空但是打包后就不是空了) serve.bind(('127.0.0.1',8080)) #服务端需要固定绑定在一个位置 while True: client,client_addr=serve.recvfrom(1024) #接收值 bytes类型 (需要限制一次最大字节数) serve.sendto(client.upper(),client_addr) #上一级有按地址返回 print(client.decode('utf8')) serve.close()

浙公网安备 33010602011771号