《计算机网络——自顶向下方法》应用层——socket编程
TCP套接字编程
典型的网络应用是由一对程序组成的(客户程序和服务器程序),他们位于两个不同的端系统中。当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字读出和写入数据彼此进行通信。
网络应用程序有两类。一类是实现在协议标准中定义的操作;另一类网络应用程序是专用的网络应用程序,这种情况下程序的应用层协议并没有公开发布在某RFC中或者其他地方。
在研发阶段,开发者必须最先做的一个决定是:程序是运行在TCP上还是运行在UDP上。
UDP套接字编程
运行在不同的机器上的进程彼此通过向进程发送报文来进行通信。进程好比是一座房子,进程的套接字就好比是一扇门。应用程序位于房子中门的一侧;运输层位于该门朝外的另一侧。
当使用UDP时,发送进程为分组附上目的地址是由目的主机IP和目的地套接字端口号组成的。同时,发送方的源地址也是由源主机IP和端口号组成的,该地址也要附在分组上(由底层操作系统完成)。
示例
- client.py
from socket import *
serverName = '192.168.0.5'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input("请输入一串小写字母:")
clientSocket.sendto(message.encode(), (serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()
- server.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print("服务器准备就绪:")
while True:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
TCP套接字编程
与UDP不同的是,TCP是一个面向连接的协议。则意味着在客户和服务器能够开始互相发送数据之前,他们先要握手和创建一个TCP连接。TCP连接的一端与客户套接字相联系另一端与服务器套接字相联系。当创建TCP连接时,我们将其与客户套接字地址和服务器套接字地址关联起来。使用创建的TCP连接,当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢给TCP连接。
随着服务器进程的运行,客户程序能够向服务器发起一个TCP连接。这是由客户程序通过创建一个TCP套接字完成的。当客户生成其TCP套接字时,它指定了服务中的欢迎套接字地址,即服务器主机IP地址及其套接字的端口号。生成套接字后,该客户发起一个三次握手并创建与服务器的一个TCP连接。发生在运输层的三次握手对于客户和服务器时完全透明的。
示例
- client.py
from socket import *
serverName = '192.168.0.5'
serverPort = 13000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
message = input("请输入一段小写字母:")
clientSocket.send(message.encode())
modifiedMessage = clientSocket.recv(1024)
print(modifiedMessage.decode())
- server.py
from socket import *
serverPort = 13000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(("", serverPort))
serverSocket.listen(1)
while True:
connectionSocket, address = serverSocket.accept()
message = connectionSocket.recv(1024)
modifiedMessage = message.upper()
connectionSocket.send(modifiedMessage)
connectionSocket.close()
上一篇: [IOS]如何在app里面改变语言