32.网络编程TCP/UDP服务
网络编程TCP:
服务器端口了解:
port:0~65535
- web服务:80
- 邮箱服务:556
- 0~1024:为服务默认的公认端口,一般我们不能用
套接字:socket
socket作用
- ip:port,有协议加持绑定了IP属性,协议属性变量
一般步骤模型如下:
import socket服务端:s = socket.socket(IP类型是啥,协议类型是啥)# ip类型:# socket.AF_INET ipv4的# socket.AF_INET6 ipv6的# 协议:# socket.SOCK_STREAM TCP协议的# socket.SOCK_DGRAM UDP协议的s.bind( (ip,port) ) #绑定可用IP和端口# ip可以是一个空字符串,代表所有可用IP# 公网IP 47.98.190.149# 私网IP 172.16.253.97# 本地回环 127.0.0.1s.listen(5) # 服务器开启监听#参数:连接等待个数c,addr = s.accept() # 阻塞 等待别人连接,阻塞会有两个返回值, 第一个是套接字 第二个是来访者的ip和端口的元组# c:套接字# addr:来访者IP和端口的元组c.recv(1024)# 参数:你一次性拿取对方传递来的多少数据,字节单位c.send(data.encode())# data: 编码过后的字符串对象 (二进制)s.close() #关闭套接字c.close() #关闭套接字
客户端:s = socket.socket(IP类型是啥,协议类型是啥)#初始化定义ip协议类型s.connect( (ip,port) )#客户端通过IP和端口的元组连接服务器s.recv(1024)# 参数:你一次性拿取对方传递来的多少数据,字节单位s.send(data.encode())# data: 编码过后的字符串对象 (二进制)s.close() #关闭套接字
下面是根据上面的socket编写以tcp协议简单的单线程聊天代码:(单线程只能1对1)
server端:import socket ip = '' #这里可以为空代表所有ip都可以用 port = 8082 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议 s.bind((ip,port)) #绑定可用ip和端口 s.listen(5) #允许5台客户端连接 while True: try: c,addr = s.accept() #阻塞 等待别人连接,没有人连我就不执行下面的代码,一般生产环境用的都是非阻塞的 print(c) print(addr) while True: #阻塞会有两个返回值,下面服务阻塞返回的c date = c.recv(1024) #接收客户端的数据,1024字节单位 if date: print('[%s]发来的消息:%s' % (addr,date.decode('utf-8'))) while True: #这里循环的是输入空数据是无限循环 msg = input('>>>') #输入你要发送的数据 if msg: c.send(msg.encode('utf-8')) #向客户端发送数据 break else: print('不能输入空数据,请从新发送') else: print('客户端已经关闭') c.close() break except KeyboardInterrupt:#ctrl + c 终结程序 s.close() break print('服务已关闭')clitent端:
import socket ip = '192.168.137.128' port = 8082 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议 s.connect( (ip,port)) #客户端通过IP和端口的元组连接服务器 while True: try: msg = input('>>>') if msg: s.send(msg.encode('utf-8')) #向服务端发送数据 else: print('不能发送空数据,请从新输入') continue date = s.recv(1024) if date: print('服务器返回的数据:',date.decode('utf-8')) else: print('服务端已经关闭') s.close() break except KeyboardInterrupt: #ctrl + c s.close() break print('客户端已关闭')运行结果:
![]()
![]()
网络编程UCP:
套接字:socket
一般步骤模型如下:
import socket服务端:s = socket.socket(IP类型是啥,协议类型是啥)# ip类型:# socket.AF_INET ipv4的# socket.AF_INET6 ipv6的# 协议类型:# socket.SOCK_STREAM TCP协议的# socket.SOCK_DGRAM UDP协议的s.bind( (ip,port) ) #UDP服务器只需要绑定自身可用IP和端口即可# ip可以是一个空字符串,代表所有可用IP# 公网IP 47.98.190.149# 私网IP 172.16.253.97# 本地回环 127.0.0.1data,c_addr = s.recvfrom() #获取这个套接字接受到的数据#data:发来的数据#c_addr:谁发来的s.sendto(msg,c_addr) #回复消息
udp客户端:socket(AF_INET,SOCK_DGRAM) #(IP类型是啥,协议类型是啥)
c.sendto(msg,s_addr) #发消息给服务端
data,s_addr = c.recvfrom() #服务端返回的数据
下面是根据上面的socket编写以udp协议简单的多线程聊天代码:(1对多个客户端)
server:
import socket ip = '' #默认允许所有的ip port = 8083 #服务器开通的端口 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #初始化ip协议类型 s.bind((ip,port)) #绑定服务ip端口 while True: try: while True: date,c_addr = s.recvfrom(1024) #接受客户端发来的消息 print('%s:%s' % (c_addr,date.decode('utf-8'))) while True: msg = input('>>>> ') if msg == 'quit' or msg == 'q': s.close() print('服务端已关闭') exit() if msg: s.sendto(msg.encode('utf-8'),c_addr) #向客户端返回消息 break else: print('不能回复为空,请从新回复消息') except KeyboardInterrupt: break s.close() print('服务端已关闭')client:
import socket ip = '192.168.137.128' #服务器ip port = 8083 #服务器端口 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #绑定属性ipv4,udp协议 while True: try: msg = input('>>> ') #输入要发送的消息 if msg == 'quit' or msg == 'q': break if msg: s.sendto(msg.encode('utf-8'),(ip,port)) #想服务器发送消息 else: print('消息不能为空,请从新回复') date,c_addr = s.recvfrom(1024) #接受服务器返回的消息 print('%s:%s' % (c_addr,date.decode('utf-8'))) except KeyboardInterrupt: break s.close() print('客户端已经关闭')运行结果:
server端:
![]()
client1:
client2:
![]()
作者:走路带风的帅界扛把子
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。