实现功能
客户端向服务端发送一串小写字母组成的字符串,服务端将源字符串转化成大写形式返回。
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)# 需要编码成bytesrequest = input("输入小写字符串:").encode("UTF-8")# 指定目标地址, 经由clientSocket发送数据报clientSocket.sendto(request, (serverName, serverPort))# 接收来自服务器的数据# 缓存长度为2048response, serverAddress = clientSocket.recvfrom(2048)# 打印返回结果print(response)# 关闭SocketclientSocket.close()
服务端程序 UDPServer.py
import socket# 服务器主机名或者IP# 如果是主机名会自动调用DNS解析serverName = ''# 服务器端口serverPort = 12000# 创建服务端的SocketserverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定本地的12000端口# serverName为空表示本地主机serverSocket.bind((serverName, serverPort))print("服务端准备完毕")while True:# 接收来自客户端的数据# 缓存长度为2048request, 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 socketserverName = '127.0.0.1'serverPort = 12000# SOCK_STREAM表示TCP SocketclientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 执行三次握手, 创建TCP连接clientSocket.connect((serverName, serverPort))# 需要编码成bytesrequest = input("输入小写字符串:").encode("UTF-8")# 与UDP不同, 不需要显式地指定目的地址clientSocket.send(request)response = clientSocket.recv(1024)# 打印返回结果print(response)# 关闭Socket, 从而关闭TCP连接clientSocket.close()
服务端 TCPServer.py
import socketserverName = ''serverPort = 12000# 创建欢迎套接字serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定服务器端口号与套接字serverSocket.bind((serverName, serverPort))# 等待并监听来自客户端的TCP连接请求# 参数定义了请求的最大连接数为1serverSocket.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版》
