网络编程
TCP编程
详细都写CSDN上了。
使用来socket建立连接
TCP连接是一种可靠的连接,这里建立基于TCP协议连接的socket,
客户端
主要是获取服务器信息的
import socket
#前面这个套接字是表示IPV的就是IP地址的类型,是IPV4,有一个是AF_INET6表示IPV6。
#第二个表示是流格式套接字,是基于HTTP协议的一种比较可靠的传输方式,有一个缓存区,所以保证数据不会丢失。
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 这里传入的参数必须是元组类型的,一个是地址(这个地址有点迷,IP地址和网址域名有什么关系)和端口号(这个比较熟悉,就是服务器什么的进程或者说任务,就会对应什么样的端口号)。
s.connect(("https://www.bilibili.com/",80))
#这里就是建立好连接
# 这里是向浏览器发送请求信息,具体是为什么这样发送,而且发送的格式是什么具体还不知道。
s.send((b'GET / HTTP/1.1\r\nHost: www.bilibili.com\r\nConnection: close\r\n\r\n'))
# 设置一个空列表用来接收从服务器发送过来的信息
buffer = []
#这里使用while循环,我的理解就是接收服务器发送的流式数据,需要一个碗,这个碗的大小就是设置好的1024,然后不断循环,直到获取到全部数据,把数据存入到列表里。
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
#这里再先详细知道一下python中字符串前“b”,“r”,“u”,“f”的作用:
#“u”表示含有中文字符的字符串
#“r”表示是一个普通的字符串,但还是str类型的,所以在前面有这个的字符串里\n,就不表示换行了。
#“b”表示这是一个bytes类型的数据,还是那个用在网络编程里面的,bytes类型数据会默认在前面加个b,表示是字节类型的数据。而且字节类型的数据也是不会遇到‘\n’给换行的。
#“f”就是输出填充的,f'{name},{age}'。
#还有一个就是在python里面bytes和str的互相转换就是str.encode('utf-8')和bytes.decode('utf-8')。
# **这一点是个重难点**着重记录一下,首先就是从服务器获取到的信息都是bytes(字节类型的),因为在网络编程中,服务器和浏览器都只认字节类型的数据。
#print(buffer)
# data = buffer[0].decode('utf-8')
# print(data)(这里得到的数据就会自动换行了)
#这里面就涉及到网页的信息,获取到服务器发送的信息里面头部信息和html信息之间是有两行换行分割的
# 这里还有个spite方法的使用,1表示分割几次。
# 这里将从服务器获取到的数据是两部分,一部分是表头信息,另一部分是HTML源码。
buffer_html = buffer[0].split(b'\r\n\r\n',1)
#print(buffer_html[1])
html_utf = buffer_html[1]
#将数据写入一个新的文件就这样写,这本来是打开一个文件的意思,后面有'w'表示写文件,就是没有这个文件,就会默认创建一个这样的文件,然后把数据写进去。
#主要要在后面加个'wb'表示以二进制写入,‘r’是只读的意思,还有其他细节可以在网上看。
with open('data.html','wb') as f:
#所以这里需要写入的数据是字节类型的数据
#二进制就是字节类型
f.write(html_utf)
#这里得到的html最后运行是出现301错误。
获取本机的IP地址
使用socket的gethostbyname()方法获取电脑的IP地址
需要传入自己电脑的名字,使用gethostname获取
import socket
hostname = socket.gethostbyname(socket.gethostname())
print(hostname)
同理既然这个获取IP地址的方法需要传入的参数是设备的名称是不是也可以获取自己手机的IP地址呢,明天来试试。
UDP编程
TCP协议需要建立通信双方的连接且采用流数据。
使用UDP协议,不需要建立连接,只需要知道IP地址和端口号就可以,但不保证数据是否全都传输到,所以比较快。
具体在CSDN上面。
电子邮件
电子邮件的发送就是用过先通过电子邮件软件(QQ邮箱这样的,成为MUA-Mail User Agent邮件用户代理);写好邮件之后,经过MTA(Mail Transfer Agent邮件传输代理,就是网易,新浪这些服务商),会经过很多的邮件传输代理商,MTA负责把邮件传输到目标的代理商(比如你有QQ邮箱写一个邮件发给163.com网易的服务商),传输会经过许多的MTA,这个我们不必要知道;最后MTA传输的邮件会到最后一个代理商MDA(Mail- 邮件投递代理)
发送者->MUA(QQ邮箱)—>MTA->MTA->......->MTA->MDA(目标代理商的服务器)->接收者(需要从服务器上下载下来)
SMTP发送邮件
SMTP发送带附件的邮件
代码已实现,还有对mime有许多不理解。
POP3接收邮件
POP3收取邮件就是编写一个MUA作为客户端,从MDA上将邮件下载下来,然后通过解析原始文本获得内容。