欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《计算机网络——自顶向下方法》应用层——socket编程

程序员文章站 2022-05-16 10:58:44
...

TCP套接字编程

典型的网络应用是由一对程序组成的(客户程序和服务器程序),他们位于两个不同的端系统中。当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字读出和写入数据彼此进行通信。
网络应用程序有两类。一类是实现在协议标准中定义的操作;另一类网络应用程序是专用的网络应用程序,这种情况下程序的应用层协议并没有公开发布在某RFC中或者其他地方。
在研发阶段,开发者必须最先做的一个决定是:程序是运行在TCP上还是运行在UDP上。

UDP套接字编程

运行在不同的机器上的进程彼此通过向进程发送报文来进行通信。进程好比是一座房子,进程的套接字就好比是一扇门。应用程序位于房子中门的一侧;运输层位于该门朝外的另一侧。
当使用UDP时,发送进程为分组附上目的地址是由目的主机IP和目的地套接字端口号组成的。同时,发送方的源地址也是由源主机IP和端口号组成的,该地址也要附在分组上(由底层操作系统完成)。
《计算机网络——自顶向下方法》应用层——socket编程

示例

  • 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连接。
《计算机网络——自顶向下方法》应用层——socket编程
随着服务器进程的运行,客户程序能够向服务器发起一个TCP连接。这是由客户程序通过创建一个TCP套接字完成的。当客户生成其TCP套接字时,它指定了服务中的欢迎套接字地址,即服务器主机IP地址及其套接字的端口号。生成套接字后,该客户发起一个三次握手并创建与服务器的一个TCP连接。发生在运输层的三次握手对于客户和服务器时完全透明的。
《计算机网络——自顶向下方法》应用层——socket编程

示例

  • 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()