Python Socket网络编程:UDP与TCP通信实战及退出机制

纸上星河
纸上星河
发布时间:2026-10-12 | 3人浏览过
原创

本文通过Python3实现Socket网络编程,涵盖UDP与TCP通信的完整示例。重点解决TCP服务端无法优雅退出的问题,通过添加quit命令实现程序安全退出,并提供客户端与服务端的交互代码。

Python Socket网络编程基础

Python内置了强大的Socket库,支持网络通信。我们可以利用它快速构建UDP和TCP通信模型。以下示例均基于Python3版本,涉及网络端口绑定、数据收发及连接管理。

UDP通信示例

UDP(用户数据报协议)是一种无连接的通信方式,适合快速数据传输。下面分别展示服务端和客户端的实现。

UDP服务端

服务端需要绑定指定端口,并持续监听来自任何发送者的数据。以下代码演示了如何接收并打印UDP数据:

import socket
port=8081
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#从指定的端口,从任何发送者,接收UDP数据
s.bind(('',port))
print('正在等待接入...')
while True:
  #接收一个数据
  data,addr=s.recvfrom(1024)
  print('Received:',data,'from',addr)

UDP客户端

客户端通过指定主机和端口,向服务端发送数据。示例如下:

import socket
port=8081
host='localhost'
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(b'hello,this is a test info !',(host,port))

TCP通信示例

TCP(传输控制协议)提供面向连接的可靠通信。以下示例展示了基础的TCP服务端和客户端实现,但需注意原始TCP方式存在无法优雅退出程序的问题。

基础TCP服务端

服务端监听指定端口,接受客户端连接并回显时间戳和接收到的数据。代码如下:

#-*- coding: utf-8 -*-
from socket import *
from time import ctime

HOST=''
PORT=12345
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)

sock.bind(ADDR)

sock.listen(5)
while True:
  print('waiting for connection')
  tcpClientSock, addr=sock.accept()
  print('connect from ', addr)
  while True:
    try:
      data=tcpClientSock.recv(BUFSIZ)
    except:
      print(e)
      tcpClientSock.close()
      break
    if not data:
      break
    s='Hi,you send me :[%s] %s' %(ctime(), data.decode('utf8'))
    tcpClientSock.send(s.encode('utf8'))
    print([ctime()], ':', data.decode('utf8'))
tcpClientSock.close()
sock.close()

基础TCP客户端

客户端连接到服务端,发送用户输入并接收回显数据。示例如下:

#-*- coding: utf-8 -*-
from socket import *

class TcpClient:
  HOST='127.0.0.1'
  PORT=12345
  BUFSIZ=1024
  ADDR=(HOST, PORT)
  def __init__(self):
    self.client=socket(AF_INET, SOCK_STREAM)
    self.client.connect(self.ADDR)

    while True:
      data=input('>')
      if not data:
        break
      self.client.send(data.encode('utf8'))
      data=self.client.recv(self.BUFSIZ)
      if not data:
        break
      print(data.decode('utf8'))
      
if __name__ == '__main__':
  client=TcpClient()

改进:支持quit命令退出

原始TCP示例中,程序无法通过特定命令优雅退出。以下改进版本添加了quit命令支持,允许用户通过发送“quit”(忽略大小写)来终止服务端和客户端程序。

改进版TCP服务端

服务端在接收数据后检查是否包含“quit”命令,若包含则设置退出标志并关闭连接。代码如下:

#-*- coding: utf-8 -*-
from socket import *
from time import ctime
from time import localtime
import time

HOST=''
PORT=1122 #设置侦听端口
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)

sock.bind(ADDR)

sock.listen(5)
#设置退出条件
STOP_CHAT=False
while not STOP_CHAT:
  print('等待接入,侦听端口:%d' % (PORT))
  tcpClientSock, addr=sock.accept()
  print('接受连接,客户端地址:',addr)
  while True:
    try:
      data=tcpClientSock.recv(BUFSIZ)
    except:
      #print(e)
      tcpClientSock.close()
      break
    if not data:
      break
    #python3使用bytes,所以要进行编码
    #s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))
    #对日期进行一下格式化
    ISOTIMEFORMAT='%Y-%m-d %X'
    stime=time.strftime(ISOTIMEFORMAT, localtime())
    s='%s发送给我的信息是:%s' %(addr[0],data.decode('utf8'))
    tcpClientSock.send(s.encode('utf8'))
    print([stime], ':', data.decode('utf8'))
    #如果输入quit(忽略大小写),则程序退出
    STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
    if STOP_CHAT:
      break
tcpClientSock.close()
sock.close()

改进版TCP客户端

客户端在发送数据前检查是否包含“quit”命令,若包含则终止循环并关闭连接。代码如下:

#-*- coding: utf-8 -*-
from socket import *

class TcpClient:
  #测试,连接本机
  HOST='127.0.0.1'
  #设置侦听端口
  PORT=1122 
  BUFSIZ=1024
  ADDR=(HOST, PORT)
  def __init__(self):
    self.client=socket(AF_INET, SOCK_STREAM)
    self.client.connect(self.ADDR)

    while True:
      data=input('>')
      if not data:
        break
      #python3传递的是bytes,所以要编码
      self.client.send(data.encode('utf8'))
      print('发送信息到%s:%s' %(self.HOST,data))
      if data.upper()=="QUIT":
        break      
      data=self.client.recv(self.BUFSIZ)
      if not data:
        break
      print('从%s收到信息:%s' %(self.HOST,data.decode('utf8')))
      
      
if __name__ == '__main__':
  client=TcpClient()

以上就是Python Socket网络编程的详细内容,更多关于Python Socket网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表