MST

星途 面试题库

面试题:Python中面向连接与无连接套接字在代码实现上的主要差异

请分别用Python代码示例展示面向连接的套接字(如TCP)和无连接的套接字(如UDP)的基本使用,并阐述它们在代码实现步骤、函数调用等方面的主要差异。
43.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

TCP 套接字基本使用示例

import socket

# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
server_socket.bind(server_address)
server_socket.listen(1)

print('等待连接...')
connection, client_address = server_socket.accept()
try:
    print('连接来自', client_address)
    while True:
        data = connection.recv(1024)
        if data:
            print('接收到:', data.decode())
            connection.sendall(data)
        else:
            break
finally:
    connection.close()
    server_socket.close()
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
client_socket.connect(server_address)

try:
    message = 'Hello, Server!'
    client_socket.sendall(message.encode())
    data = client_socket.recv(1024)
    print('接收到:', data.decode())
finally:
    client_socket.close()

UDP 套接字基本使用示例

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 9999)
server_socket.bind(server_address)

print('等待接收数据...')
while True:
    data, client_address = server_socket.recvfrom(1024)
    print('接收到来自{}的消息: {}'.format(client_address, data.decode()))
    server_socket.sendto(data, client_address)
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DUDP)
server_address = ('localhost', 9999)
message = 'Hello, Server!'
client_socket.sendto(message.encode(), server_address)
data, server = client_socket.recvfrom(1024)
print('接收到:', data.decode())
client_socket.close()

主要差异

  1. 代码实现步骤
    • TCP
      • 服务器端需要先创建套接字,绑定地址,然后调用 listen 进入监听状态,之后通过 accept 接受客户端连接。
      • 客户端创建套接字后,调用 connect 连接到服务器。
    • UDP
      • 服务器端和客户端都只需创建套接字并绑定地址(客户端也可不绑定,由系统自动分配)。没有监听和连接步骤,直接可以发送和接收数据。
  2. 函数调用
    • TCP
      • 使用 sendall 发送数据,它会尝试将数据完整发送,如果发送缓冲区已满,会阻塞直到数据可以发送。
      • 使用 recv 接收数据,会阻塞等待数据到达,接收到的数据长度可能小于请求的长度,需要循环接收直到接收完所有数据。
    • UDP
      • 使用 sendto 发送数据,它将数据发送到指定地址,不管对方是否接收。
      • 使用 recvfrom 接收数据,会阻塞等待数据到达,接收时会返回数据和发送方的地址。