实现功能

客户端向服务端发送一串小写字母组成的字符串,服务端将源字符串转化成大写形式返回。

UDP Socket

目的地址=主机IP地址+Socket的端口号

客户端程序 UDPClient.py

  1. import socket
  2. # 服务器主机名或者IP
  3. # 如果是主机名会自动调用DNS解析
  4. serverName = 'localhost'
  5. # 服务器端口
  6. serverPort = 12000
  7. # 创建客户端的Socket
  8. # AF_INET表示底层网络使用IPv4
  9. # SOCK_DGRAM表示是UDP Socket
  10. # 无需显式地指定端口, 由操作系统进行分配
  11. clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  12. # 需要编码成bytes
  13. request = input("输入小写字符串:").encode("UTF-8")
  14. # 指定目标地址, 经由clientSocket发送数据报
  15. clientSocket.sendto(request, (serverName, serverPort))
  16. # 接收来自服务器的数据
  17. # 缓存长度为2048
  18. response, serverAddress = clientSocket.recvfrom(2048)
  19. # 打印返回结果
  20. print(response)
  21. # 关闭Socket
  22. clientSocket.close()

服务端程序 UDPServer.py

  1. import socket
  2. # 服务器主机名或者IP
  3. # 如果是主机名会自动调用DNS解析
  4. serverName = ''
  5. # 服务器端口
  6. serverPort = 12000
  7. # 创建服务端的Socket
  8. serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  9. # 绑定本地的12000端口
  10. # serverName为空表示本地主机
  11. serverSocket.bind((serverName, serverPort))
  12. print("服务端准备完毕")
  13. while True:
  14. # 接收来自客户端的数据
  15. # 缓存长度为2048
  16. request, clientAddress = serverSocket.recvfrom(2048)
  17. # 打印源字符串
  18. print("request={}".format(request))
  19. response = request.upper()
  20. # 打印返回结果
  21. print("response={}".format(response))
  22. # 指定目标地址, 经由serverSocket发送数据报
  23. serverSocket.sendto(response, clientAddress)

TCP Socket

TCP作为一个面向连接的协议,通信过程要复杂点,在客户和服务器能够开始互相发送数据之前,它们先要握手和创建一个TCP连接,这个TCP 连接的一端与客户套接字相联系,另一端与服务器套接字相联系。
客户端套接字先要与欢迎套接字进行三次握手(这是所有要与服务器通信的客户的起始接触点),服务端为每个客户端生成一个新的连接套接字,用于数据的双向传输。
这三次握手发生在传输层,对于客户端和服务端的程序来说是透明的。

客户端 TCPClient.py

  1. import socket
  2. serverName = '127.0.0.1'
  3. serverPort = 12000
  4. # SOCK_STREAM表示TCP Socket
  5. clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. # 执行三次握手, 创建TCP连接
  7. clientSocket.connect((serverName, serverPort))
  8. # 需要编码成bytes
  9. request = input("输入小写字符串:").encode("UTF-8")
  10. # 与UDP不同, 不需要显式地指定目的地址
  11. clientSocket.send(request)
  12. response = clientSocket.recv(1024)
  13. # 打印返回结果
  14. print(response)
  15. # 关闭Socket, 从而关闭TCP连接
  16. clientSocket.close()

服务端 TCPServer.py

  1. import socket
  2. serverName = ''
  3. serverPort = 12000
  4. # 创建欢迎套接字
  5. serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. # 绑定服务器端口号与套接字
  7. serverSocket.bind((serverName, serverPort))
  8. # 等待并监听来自客户端的TCP连接请求
  9. # 参数定义了请求的最大连接数为1
  10. serverSocket.listen(1)
  11. print("服务端准备完毕")
  12. while True:
  13. # 为这个特定客户创建新的连接套接字
  14. # 客户端和服务端通过该连接套接字互相发送字节
  15. # 同时可以确保有序到达
  16. connectSocket, clientAddress = serverSocket.accept()
  17. request = connectSocket.recv(1024)
  18. # 打印源字符串
  19. print("request={}".format(request))
  20. response = request.upper()
  21. # 打印返回结果
  22. print("response={}".format(response))
  23. # 发送结果
  24. connectSocket.send(response)
  25. # 关闭该连接套接字
  26. # 但这是欢迎套接字依旧保持打开
  27. connectSocket.close()

参考教材

《计算机网络自顶向下方法第6版》