1.网络编程主要是解决不同电脑之间的通信与建立连接的问题。
2.为了规范所有的电脑通信,我们采用统一的规定,对信号进行传递和处理。这一规定现在统称为TCP/IP协议,这是一个协议族,而并非2个协议,它规定了计算机之间通信的模板。
3.端口,端口是一个面向计算内部程序的概念,一个计算机可以有多个端口,每个端口只能由一个软件绑定。如信息从外界转入计算机系统时,系统需要通过端口号来识别信息应该送到哪一个端口给哪一个程序使用。
4.IP,每一台在网络中的设备均有其唯一的IP,我们通过标识IP来确定信息接收方的地址。IP是一串4字节的地址,前几个字节为网络号,后几个自己为局域网内机器号。按网络号的字节数分为A、B、C、D四类,其中一部分网络号为公共网络号。网络号通过网关掩码确定,网关掩码有几个255就有几字节网络号。
5.MAC地址,MAC地址为每一台机器独有的地址,由12位16进制数组成,前8位标识厂商地址,后8位标识厂商网卡。MAC地址是机器的门牌号,只有知道机器的门牌号才可以将信息送入。但是在发送信息时我们是不知道目标设备的MAC地址的,其通过ARP协议自动获得下一中转设备的MAC地址。在信息传输过程中数据包中表示的IP是不变的,永远是目标计算机的IP,而数据包标识的MAC地址是随传输过程变化的,其值是下一传输设备的MAC地址。
6.通过套接字socket进行信息的发送与接受。
在python中,我们通过socket封装了底层的通信过程,只需要使用socket库就可以实现想要的功能
eg1:
import socket
s = socket.socket(socket.AF_NET, socket.SOCK_STKEAM) //创建TCP套接字 若为s = socket.socket(socket.AF_NET, socket.SOCK_DGRAM) 则为udp通信,以下默认为udp
bindAddr = ('',7788) //绑定IP和端口,IP空白表示自动获取IP端口必须为占用
udpsocket.sendto("haha", ("192,168,119,210",2426)) //将信息发送至指定IP的指定端口,对发送的信息可以按指定规则编 码和解码,eg:udpsocket.sendto(sendData.encode('utf-8'),("192,168,119,210",2426))
recvData = udpsocket.recvfrom(1024) //进程到此阻塞,等待接受数据,1024为接收数据的最大长度
以上为简单的使用socket进行udp的收发信息。
eg2:使用gb2312解码接收数据
from socket import *
udpsocket = socket(socket.AF_NET, socket.SOCK_STKEAM)
udpsocket.bind('',7788) //绑定IP和端口,IP空白表示自动获取IP端口必须为占用
recvData = udpsocket.recvfrom(1024) //进程到此阻塞,等待接受数据
content, destInfo = recvData
print(contene.decode(gb2312))
从以上2个例子可以看出,udp的通信过程类似于写信。
7.TCP通信过程
相比udp通信过程使用写信的方式,TCP传输控制协议更加稳定,可靠。
一个简单的tcp通信如下,服务器端:
from socket import *
serverSocket = socket(socket.AF_NET, socket.SOCK_STKEAM)
serverSocket.bind(('',8899))
serverSocket.listen(5) //表示提前创立好的套接字数量
clientSocket,clientInfo = serverSocket.accept() //clientSocket为该客户独占的服务套接字Info为客户IP和端口号
recvData = clientSocket.recv(1024)
clientSocket.close()
serverSocket.close()
客户端:
#coding = utf-8
from socket import *
clientSocket = socket(socket.AF_NET, socket.SOCK_STKEAM)
SerAddr = ('XXXXXXXX',8899)
clientSocket.connect(SerAddr)
sendData = raw_input("输入发送数据")
clientSocket.send(sendData)
recvData = clientSocket.recv(1024)
clientSocket.close()
相比udp通信,tcp多了一个connect即连接过程(三次握手),以及未显示出来的结束过程即(四次挥手)其过程如下图所示:
其中,SYN为请求操作码,ACK为答复操作码。
8.上述的通信过程均会在运行到recvData时发生阻塞,导致服务器只能为一个客户服务,这显然是不合理的。在实际应用过程中我们往往采用多进程多线程、协程或非阻塞式编程来实现多客户并发。