前言
TCP是 Transmission Control Protocol 的缩写,即传输控制协议。 它充分地实现了数据传输时的各种控制功能,可以进行丢包时重发控制,还可以对次序乱掉的分包进行顺序控制。而这些再UDP中都没有。此外,TCP作为一种面向有连接的协议,只要在确认通信对端存在时才会发生数据,从而可以控制通信流量的浪费。
UDP是 User Datagram Protocol 的缩写,即用户数据报协议。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收的那一刻,立即按照原样发送到网络上的一种机制。
一、UDPClient与UDPServer源代码:
# UDP Client
from socket import *
# 定义服务器的IP地址和端口号
ServerName = '192.168.135.112'
ServerPort = 11451
# 创建客户端套接字
ClientSocket = socket(AF_INET, SOCK_DGRAM)
# 接收用户输入的小写字符串
message = input('请输入一个句子: ')
# 发送数据到服务器
ClientSocket.sendto(message.encode(), (ServerName, ServerPort))
# 接收服务器返回的大写字符串和服务器地址
modifiedMessage, serverAddress = ClientSocket.recvfrom(2048)
# 打印服务器返回的大写字符串
print(f"从服务器接收到的数据:{modifiedMessage.decode()}")
# 关闭套接字
ClientSocket.close()
# UDP Server
from socket import *
# 定义服务器端口号
ServerPort = 11451
# 创建服务器套接字
ServerSocket = socket(AF_INET, SOCK_DGRAM)
# 绑定套接字到指定端口
ServerSocket.bind(('', ServerPort))
# 打印服务器准备就绪信息
print("UDP服务器正在等待消息...")
while True:
# 接收客户端发送的数据和客户端地址
message, ClientAddress = ServerSocket.recvfrom(2048)
print(f"来自 {ClientAddress} 的数据: {message.decode('utf-8')}")
# 将接收到的小写字符串转换为大写
modifiedMessage = message.decode().upper()
# 将大写字符串发送给客户端
ServerSocket.sendto(modifiedMessage.encode(), ClientAddress)
这两段代码实现了基于UDP协议的客户端和服务器之间的通信。客户端通过用户输入获取一个字符串消息,然后将该消息编码并发送到预定义的服务器IP地址(192.168.135.122)和端口号(11451)。服务器在指定端口上监听来自客户端的消息。一旦接收到消息,服务器将其解码为小写形式,然后将其转换为大写形式。接着,服务器将大写形式的消息发送回客户端,并在控制台上显示来自客户端的消息以及发送给客户端的大写形式的消息。客户端在接收到来自服务器的大写形式的消息后,将其解码并显示在控制台上。整个通信过程完成后,客户端和服务器关闭其套接字连接。
二、TCPClient与TCPServer源代码:
# TCP Client
from socket import *
# 定义服务器的IP地址和端口号
serverName = '192.168.135.112'
serverPort = 11451
# 创建客户端套接字
clientSocket = socket(AF_INET, SOCK_STREAM)
# 连接到服务器
clientSocket.connect((serverName, serverPort))
# 接收用户输入的小写字符串
sentence = input('请输入一个句子: ')
# 发送数据到服务器
clientSocket.send(sentence.encode())
# 接收服务器返回的大写字符串
modifiedSentence = clientSocket.recv(1024)
# 打印服务器返回的大写字符串
print('从服务器接收到的数据:', modifiedSentence.decode())
# 关闭套接字
clientSocket.close()
# TCP Server
from socket import *
# 定义服务器端口号和套接字
serverPort = 11451
serverSocket = socket(AF_INET, SOCK_STREAM)
# 绑定套接字到指定端口
serverSocket.bind(('', serverPort))
# 监听连接,最大连接数为1
serverSocket.listen(1)
print('TCP服务器正在等待消息...')
while True:
# 接受客户端连接
connectionSocket, addr = serverSocket.accept()
print(f"来自 {addr} 的连接已建立")
# 接收客户端发送的数据
sentence = connectionSocket.recv(1024).decode()
print(f"收到的句子: {sentence}")
# 将接收到的小写字符串转换为大写
capitalizedSentence = sentence.upper()
# 将大写字符串发送给客户端
connectionSocket.send(capitalizedSentence.encode())
# 关闭连接套接字
connectionSocket.close()
这段代码实现了一个基于TCP协议的简单客户端-服务器通信系统。客户端通过输入一个字符串消息,将其发送到指定的服务器IP地址(192.168.135.122)和端口号(11451)。服务器在指定端口上监听客户端的连接请求,一旦有客户端连接进来,服务器接受连接并接收客户端发送的消息。接收到消息后,服务器将其转换为大写形式,并将处理后的消息发送回客户端。整个通信过程完成后,客户端和服务器关闭其套接字连接。
总结
代码实现参考《计算机网络自顶向下方法 第八版》中TCP与UDP通信的实现。