Python网络编程篇1
python的网络编程主要的知识点在于UDP,TCP。
UDP与TCP都会涉及到端口问题。首先就先来介绍一下常用的端口:
21/tcp FTP 文件传输协议
22/tcp SSH 安全登录、文件传送(SCP)和端口重定向
23/tcp Telnet 不安全的文本传送
25/tcp SMTP Simple Mail Transfer Protocol (E-mail)
69/udp TFTP Trivial File Transfer Protocol
79/tcp finger Finger
80/tcp HTTP 超文本传送协议 (WWW)
88/tcp Kerberos Authenticating agent
110/tcp POP3 Post Office Protocol (E-mail)
113/tcp ident old identification server system
119/tcp NNTP used for usenet newsgroups
220/tcp IMAP3
443/tcp HTTPS used for securely transferring web pages
端口分为三类:
第一类
公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议,例如:80端口实际上总是HTTP通讯。
第二类
注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
第三类
动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
上述知识作为了解即可,某些常用服务的端口也会经常出现在面试题中。
在UDP或者是TCP中,都会用到一个库,socket库。
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
UDP
UDP介绍
UDP — 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
UDP特点
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
【适用情况】
UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如
语音广播
视频
QQ
TFTP(简单文件传送)
SNMP(简单网络管理协议)
RIP(路由信息协议,如报告股票市场,航空信息)
DNS(域名解释)
注重速度流畅
UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
创建UDP客户端的步骤很简单,分为三步:
1.创建udp套接字
2.发送/接受消息
3.关闭套接字
示例如下:
# 创建一个udp客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''
family = AF_INET 为网络间通信,family = AF_UNIX为本机通信
type = SOCK_DGRAM 为数据报套接字,也就是UDP
type = SOCK_STREAM 为流式套接字,也就是TCP
'''
# 设置接受信息的服务器的地址
recvAddress = ('192.168.136.1', 9696)
# 发送信息
data = 'hello,world'
client_socket.sendto(data.encode('utf-8'), recvAddress)
print('信息已经发出!')
# 接受信息
(recv_info, addr) = client_socket.recvfrom(1024)
print('接受到的信息:'+recv_info.decode('utf-8')+' 数据从'+str(addr)+'发出')
# 关闭套接字
client_socket.close()
使用网络调试助手可以检查程序是否运行正常
结果如下:
端口9696接收到了udp传递过去的hello,world。