实现功能
客户端向服务端发送一串小写字母组成的字符串,服务端将源字符串转化成大写形式返回。
UDP Socket
目的地址=主机IP地址+Socket的端口号
客户端程序 UDPClient.py
import socket
# 服务器主机名或者IP
# 如果是主机名会自动调用DNS解析
serverName = 'localhost'
# 服务器端口
serverPort = 12000
# 创建客户端的Socket
# AF_INET表示底层网络使用IPv4
# SOCK_DGRAM表示是UDP Socket
# 无需显式地指定端口, 由操作系统进行分配
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 需要编码成bytes
request = input("输入小写字符串:").encode("UTF-8")
# 指定目标地址, 经由clientSocket发送数据报
clientSocket.sendto(request, (serverName, serverPort))
# 接收来自服务器的数据
# 缓存长度为2048
response, serverAddress = clientSocket.recvfrom(2048)
# 打印返回结果
print(response)
# 关闭Socket
clientSocket.close()
服务端程序 UDPServer.py
import socket
# 服务器主机名或者IP
# 如果是主机名会自动调用DNS解析
serverName = ''
# 服务器端口
serverPort = 12000
# 创建服务端的Socket
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地的12000端口
# serverName为空表示本地主机
serverSocket.bind((serverName, serverPort))
print("服务端准备完毕")
while True:
# 接收来自客户端的数据
# 缓存长度为2048
request, clientAddress = serverSocket.recvfrom(2048)
# 打印源字符串
print("request={}".format(request))
response = request.upper()
# 打印返回结果
print("response={}".format(response))
# 指定目标地址, 经由serverSocket发送数据报
serverSocket.sendto(response, clientAddress)
TCP Socket
TCP作为一个面向连接的协议,通信过程要复杂点,在客户和服务器能够开始互相发送数据之前,它们先要握手和创建一个TCP连接,这个TCP 连接的一端与客户套接字相联系,另一端与服务器套接字相联系。
客户端套接字先要与欢迎套接字进行三次握手(这是所有要与服务器通信的客户的起始接触点),服务端为每个客户端生成一个新的连接套接字,用于数据的双向传输。
这三次握手发生在传输层,对于客户端和服务端的程序来说是透明的。
客户端 TCPClient.py
import socket
serverName = '127.0.0.1'
serverPort = 12000
# SOCK_STREAM表示TCP Socket
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 执行三次握手, 创建TCP连接
clientSocket.connect((serverName, serverPort))
# 需要编码成bytes
request = input("输入小写字符串:").encode("UTF-8")
# 与UDP不同, 不需要显式地指定目的地址
clientSocket.send(request)
response = clientSocket.recv(1024)
# 打印返回结果
print(response)
# 关闭Socket, 从而关闭TCP连接
clientSocket.close()
服务端 TCPServer.py
import socket
serverName = ''
serverPort = 12000
# 创建欢迎套接字
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器端口号与套接字
serverSocket.bind((serverName, serverPort))
# 等待并监听来自客户端的TCP连接请求
# 参数定义了请求的最大连接数为1
serverSocket.listen(1)
print("服务端准备完毕")
while True:
# 为这个特定客户创建新的连接套接字
# 客户端和服务端通过该连接套接字互相发送字节
# 同时可以确保有序到达
connectSocket, clientAddress = serverSocket.accept()
request = connectSocket.recv(1024)
# 打印源字符串
print("request={}".format(request))
response = request.upper()
# 打印返回结果
print("response={}".format(response))
# 发送结果
connectSocket.send(response)
# 关闭该连接套接字
# 但这是欢迎套接字依旧保持打开
connectSocket.close()
参考教材
《计算机网络自顶向下方法第6版》