网络编程概论
Socket是计算机之间进行网络通信的一套程序接口.目前,Socket编程已经成为了网络编程的标准,计算机之间通信都必须遵守Socket接口的相关要求.
Socket对象是网络通信的基础,字相当于一个管道连接了发送端和接收端,并在两者之间互相传递数据.Python对Socket进行了二次封装,简化了程序开发步骤,大大提高了开发的效率.
在网络通信模型中,需要两个重要的信息才能完成数据的传输:IP地址和端口号. 在接收端,主机负责接收所有发给自己的数据包,并将这些数据放到操作系统的数据传输线上,再由相应的应用程序在传输线上根据端口号分别拿取各自所需要的数据. 这要求应用程序在数据到达之前就必须在线路上进行等待.
一旦传输总线上有数据到达,这些应用程序会按照数据包上的端口标示分别拿取自己的数据.但是如果数据到达传输总线时,相应的应用程序还没有启动,那么该数据将被操作系统丢弃.
上面的内容说明:
①网络数据包中需要有接受者的信息,即IP地址和端口号
②接收者必须在数据到达前,做好接收数据的准备
③不同的应用程序,依靠不同的端口号来识别自己的数据.
TCP/IP协议簇简介
实际上,数据在Internet上传输时经过了很多的处理,这些处理包括在你发送的消息填上对方的地址,打包和转换为电信号等一系列的过程. 接收方又将电信号转换为数据包,再拆包,最终看到发送的原始信息.
这些复杂的过程是通过TCP/IP协议簇来完成的,它包含了一系列网络通信的基础协议.每个协议完成不同的功能.
在TCP/IP参考模型中总共分为5层:
应用层,传输层,网络层,数据链路层 和 物理层
在通信时只有同一层的硬件或软件才能互相识别数据,也就是说应用层只和应用层进行对话,不会发生一边是应用层而另一边是传输层的对话.
在TCP/IP参考模型中,IP地址是网络层的要素,端口是应用层的要素.
数据在经过每一层的时候,都会被加入一些额外的信息.这些信息被称为头部.加入头部的过程被称为数据的封装.
传输层会加入一个TCP头部(包含端口号)
网络层会加入IP头部
数据链路层会加入帧头部和尾部
数据链路层的作用就是负责将数据从链路的一端传到链路的另一端.
UDP网络编程初步
在网络中有两种传输数据的方式,不会出现数据丢失的是TCP传输,会发生数据丢失的是UDP传输.
大多数情况下,网络中使用可靠的TCP.
为了通信,发送端和接收端都必须创建Socket对象.发送端利用Socket发送数据到网络上,接收端从Socket上读取数据,然后用Print函数显示在屏幕上.
接收端代码
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(("",15001))
data,addr = s.recvfrom(1024)
print(data)
s.close()
发送端代码
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto((‘Hello!!‘).encode(),(‘192.168.1.224‘,15001))
s.close()
代码解释
发送端
socket模块包含了进行网络通信时所需要的各种功能函数,它把复杂的网络通信过程进行了封装,极大地简化了开发的难度,提高了开发效率.
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
创建一个socket对象,两个参数:
第一个表示协议族family.
第二个表示协议类型type.
函数的返回值 是一个socket对象.若对象创建成功,则可以利用s来进行数据的发送和接收.
sendto()是发送数据的函数.第一个参数是需要发送的字符串,第二个参数是一个元组,第一个元素是IP地址,第二个是端口.
接收端
调用socket时应该使用相同的参数.
bind()函数用来将socket绑定到指定的端口.bind()函数有两个参数,第一个是IP地址,第二个是端口.第一个参数可以使用空字符串,表示使用本机的任何可用IP.第二个参数使监听端口.
在网络通信中,计算机的一个端口只能被1个应用软件使用,可用的端口范围是1-65536.其中1-1024中的端口大多被操作系统和常用软件使用.
recvfrom()函数用来接收网络中的数据.必须在bind()函数之后调用.两者结合起来就是在指定的端口进行监听.
recvfrom()的第一个返回值是接收到的数据,第二个返回值是发送方的IP地址.
recvfrom()有1个参数,用来指定接收缓冲区的大小.
发送端也称为客户端,接收端也称为服务器端.
UDP函数介绍
socket
socket第一个参数:
socket.AF_INET IPv4
socket.AF_INET6 IPv6
socket第二个参数
SOCK_STREAM TCP协议
SOCK_DGRAM UDP协议
sendto
socket.sendto(string,address)
发送字符串string到address指定的主机里.
recvfrom
socket.recvfrom(bufsize)
从网络上接收UDP数据包,并将接收到的数据存放到bufsize定义的内存空间里面.如果bufsize的值小于接收到的数据包的大小,那么数据将会溢出.