参考《计算机网络:自顶向下方法》
由客户端发送一串小写英文的字符串给服务端,服务端将其转为大写英文并发送回给客户端
UDP套接字编程
UDPClient.py
from socket import *
serverName = '172.31.59.5' # 服务端ip
serverPort = 12000 # 服务端端口号
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建客户的套接字 AF_INET表示使用ipv4,SOCK_DGRAM表示是一个udp套接字
message = input('Input lowercase sentence:') # 获取用户输入的字符串
# encode将字符串转字节,sendto为报文附上目的地址(serverName, serverPort)并向进程的套接字clientSocket发送结果分组
clientSocket.sendto(message.encode(), (serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # 接收到的分组的数据放入modifiedMessage,源地址放入serverAddress
print(modifiedMessage.decode()) # 将报文从字节转为字符串,打印出来
clientSocket.close() # 关闭套接字,关闭进程
UDPServer.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort)) # 将端口号12000与该服务器的套接字绑定在一起
print("the server is ready to receive")
while True:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.decode().upper() # 将报文转为字符串后,获取客户发送的行并将其转化为大写
serverSocket.sendto(modifiedMessage, clientAddress) # 将客户的地址附到大写的报文上,并将所得得分组发送到服务器的套接字中
运行结果:
服务端
客户端:
TCP套接字编程
TCPClient.py
from socket import *
serverName = '172.31.59.5' # 服务端ip
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM) # 创建客户的套借字,AF_INET表明底层网络使用ipv4,SOCK_STREAM表明是一个tcp套接字
clientSocket.connect((serverName, serverPort)) # 发送数据前要执行三次握手,并在客户和服务器之间创建一个tcp连接
sentence = input('input lowercase sentence:') # 获取用户输入的字符串
clientSocket.send(sentence.encode()) # 将字符串中的字节放到tcp连接中去(这里和udp不同,不需要显式创建分组并为分组附上目的地址)
modifiedSentence = clientSocket.recv(1024) # 字符到达服务器被放置在字符串中一直积累,直到该行以回车符结束为止
print("from server:", modifiedSentence.decode())
clientSocket.close() # 关闭套接字,因此关闭了客户和服务器之间的tcp连接,引起客户中的tcp向服务器中的tcp发送一条tcp报文
TCPServer.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort)) # 将服务器的端口号与该套接字关联起来
serverSocket.listen(1) # serverSocket是欢迎套接字,等待并聆听客户的tcp连接请求,参数定义了请求连接的最大数
print("the server is ready to receive")
while True:
# 在服务器中创建一个新套接字connectionSocket,客户和服务器则完成了握手,clientSocket和serverSocket之间创建了一个tcp连接
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024).decode()
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence.encode())
connectionSocket.close() # 关闭了连接套接字,但serverSocket保持打开,所以另一个客户此时能够敲门
运行结果:
服务端:
客户端: