Hello,大家好。本期来和大家一起学习一下网络编程UDP的相关知识。
ip地址:用来在网络中标记一台电脑,在本地局域网上是唯一的。
查看电脑ip地址:ipconfig(win)/ifconfig(linux/mac)
端口:设备与外界通讯交流的出口
一共有65536个(0 - 65535) 端口
知名端口是众所周知的端口号。范围从0到1023
例如:443:HTTPS 80:HTTP ...
动态端口一般不固定分配某种服务,而是动态分配。范围是从1024到65535
TCP/IP协议是一个协议簇。里面包括了很多协议,之所以命名为TCP/IP协议,是因为TCP、IP协议是两个很重要的协议。
python网络编程用的两种协议:TCP、UDP通过这两种协议将字节码进行网络传输的。
str->bytes:encode(编码)
bytes->str:decode(解码)
使用方式:
bytes.decode(encoding="utf-8", errors="strict")
str.encode(encoding="utf-8", errors="strict")
errors:错误的处理方案。
encoding:解码编码过程中使用的编码(此处指“编码方案”是名词)
示例:
text = '我是文本'
bytesText = text.encode(encoding="utf-8", errors="strict")
print(bytesText) # b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
strText = bytesText.decode(encoding="utf-8", errors="strict")
print(strText) # 我是文本
1台电脑上是通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。
其实TCP/IP协议已经帮我们解决了这个问题。
网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程。
这样利用ip地址+协议+端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
socket(简称 套接字)是进程间通信的一种方式,它与其他进程间通信的主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 socket 来完成通信的。
例如我们每天浏览的网页、QQ 聊天、收发 email 等等。
套接字使用流程:
创建套接字
使用套接字收/发数据
关闭套接字
import socket
socket_ = socket.socket(AddressFamily, Type)
# AddressFamily: socket.AF_INET(用于Internet进程之间通信)、socket.AF_UNIX(用于同一台机器进程间通信)
# Type:socket.SOCK_STREAM(tcp)、socket.SOCK_DGRAM(udp)
创建一个tcp socket(tcp套接字)
import socket
# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
创建一个udp socket(udp套接字)
import socket
# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
UDP是一种无连接的传输层协议,不提供可靠性,传输量小,传输速度较快。
步骤:
创建客户端套接字
发送/接收数据
关闭套接字
python代码:
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可选(接收时的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.发送数据到指定的电脑
send_data = input('请输入你要发送的数据:')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.5.132', 6666))
if send_data == 'exit':
break
# 可选(接收对方发送的数据)
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
创建客户端套接字
绑定ip和端口
接收/发送数据
关闭套接字python代码:
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必须选择接收时的ip和端口 (ip,端口)
local_address = ('192.168.5.132', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 可选(发送数据到指定的电脑)
send_data = input('请输入你要发送的数据:')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
if send_data == 'exit':
break
# 4.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
如果是两台电脑的话:
客户端(192.168.2.4):
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可选(接收时的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.发送数据到指定的电脑
send_data = input('请输入你要发送的数据:')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.5.132', 6666))
if send_data == 'exit':
break
# 可选(接收对方发送的数据)
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
服务端(192.168.5.132):
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必须选择接收时的ip和端口 (ip,端口)
local_address = ('192.168.5.132', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 可选(发送数据到指定的电脑)
send_data = input('请输入你要发送的数据:')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
if send_data == 'exit':
break
# 4.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
效果演示:
客户端(192.168.2.4)
服务端(192.168.5.132)
如果是单台电脑的话:
客户端(192.168.2.4):
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 可选(接收时的端口 ('',端口))
local_address = ('', 8080)
udp_socket.bind(local_address)
while True:
# 2.发送数据到指定的电脑
send_data = input('请输入你要发送的数据:')
udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 6666))
if send_data == 'exit':
break
# 可选(接收对方发送的数据)
# recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# recv_msg = recv_data[0].decode('utf-8')
# recv_address = recv_data[1]
# print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 3.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
服务端(192.168.2.4):
import socket
def main():
# 1.创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.必须选择接收时的ip和端口 (ip,端口)
local_address = ('192.168.2.4', 6666)
udp_socket.bind(local_address)
while True:
# 3.接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
recv_address = recv_data[1]
print('当前客户端地址:{},当前接受的信息是:{}'.format(recv_address, recv_msg))
# 可选(发送数据到指定的电脑)
# send_data = input('请输入你要发送的数据:')
# udp_socket.sendto(send_data.encode('utf-8'), ('192.168.2.4', 8080))
# if send_data == 'exit':
# break
# 4.关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
效果演示:
客户端(192.168.2.4)
服务端(192.168.2.4)
下篇文章我们来一起探讨一下TCP。
(剧透:下篇文章更精彩好玩哦!)