python中socket详解使用教程(结尾有案列)

socket 是 Python 中用于网络通信的一个标准库。它提供了创建网络套接字并进行网络通信的接口。下面我会详细解释 Python 中 socket 的基本概念和使用方法。

简单列程,在文章后面,可以自行翻阅

基本概念

  • 套接字(Socket):套接字是计算机之间进行通信的一种约定或端点,是不同主机间进程进行通信的端点。

  • TCP 和 UDP

    • TCP(传输控制协议):面向连接的、可靠的、基于字节流的传输层通信协议。
    • UDP(用户数据报协议):无连接的、不可靠的、基于数据报的传输层通信协议。

创建套接字

在 Python 中,使用 socket 模块创建套接字的基本语法如下:

import socket  # 创建一个 TCP 套接字  
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建一个 UDP 套接字  
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

其中:

  • socket.AF_INET 表示使用 IPv4 地址。
  • socket.SOCK_STREAM 表示使用 TCP 协议。
  • socket.SOCK_DGRAM 表示使用 UDP 协议。

绑定地址和端口

对于服务器端套接字,通常需要绑定到一个特定的地址和端口上:

tcp_socket.bind(('localhost', 12345))

监听连接(仅适用于 TCP)

对于 TCP 服务器,需要监听连接:

tcp_socket.listen(5)  # 最多挂起 5 个连接

接受连接(仅适用于 TCP)

服务器可以使用 accept 方法接受客户端的连接请求:

client_socket, client_address = tcp_socket.accept()

这将返回一个包含新套接字和客户端地址的元组。新套接字用于与客户端通信。

连接服务器(仅适用于 TCP)

对于 TCP 客户端,需要连接到服务器:

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

发送和接收数据

  • 发送数据

对于 TCP,使用 send 或 sendall 方法:

tcp_socket.send(b'Hello, server!')

对于 UDP,使用 sendto 方法:

udp_socket.sendto(b'Hello, server!', ('server_address', port))
  • 接收数据

对于 TCP,使用 recv 方法:

data = tcp_socket.recv(1024)  # 最多接收 1024 字节的数据

对于 UDP,使用 recvfrom 方法:

data, server_address = udp_socket.recvfrom(1024)

关闭套接字

使用 close 方法关闭套接字:

socket.close()

TCP示例

TCP 服务器示例
import socket  def start_tcp_server():  server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  server_socket.bind(('localhost', 12345))  server_socket.listen(5)  print('Server started, listening on port 12345...')  while True:  client_socket, client_address = server_socket.accept()  print(f'Connection from {client_address}')  data = client_socket.recv(1024)  print(f'Received data: {data.decode()}')  client_socket.send(b'Hello, client!')  client_socket.close()  if __name__ == '__main__':  start_tcp_server()
TCP 客户端示例
import socket  def start_tcp_client():  client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  client_socket.connect(('localhost', 12345))  client_socket.send(b'Hello, server!')  data = client_socket.recv(1024)  print(f'Received data from server: {data.decode()}')  client_socket.close()  if __name__ == '__main__':  start_tcp_client()


UDP服务器示例

UDP 服务器示例

import socket  def start_udp_server():  server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字  server_socket.bind(('localhost', 12345))  # 绑定地址和端口  print('UDP Server started, listening on port 12345...')  while True:  data, client_address = server_socket.recvfrom(1024)  # 接收数据  print(f'Received data from {client_address}: {data.decode()}')  server_socket.sendto(b'Hello, client!', client_address)  # 发送响应  if __name__ == '__main__':  start_udp_server()

UDP 客户端示例 

import socket  def start_udp_client():  client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字  message = b'Hello, server!'  server_address = ('localhost', 12345)  client_socket.sendto(message, server_address)  # 发送数据  data, server_address = client_socket.recvfrom(1024)  # 接收响应  print(f'Received data from server: {data.decode()}')  client_socket.close()  # 关闭套接字  if __name__ == '__main__':  start_udp_client()

示例解释

UDP服务器

  • 创建一个UDP套接字。
  • 绑定到本地地址和端口。
  • 进入一个无限循环,接收来自客户端的数据。
  • 对于接收到的每条消息,打印其内容,并发送一个响应给客户端。

UDP客户端

  • 创建一个UDP套接字。
  • 准备要发送的消息。
  • 发送消息到服务器的地址和端口。
  • 等待服务器的响应,并打印其内容。
  • 关闭套接字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue源码解读学习

Vue源码 观察者模式 & 发布订阅 观察者模式:中心一对多 系统单点间的灵活和拓展(广播的方式) 发布订阅:将注册列表遍历发布给订阅者 initInject initState initProvide他们挂载顺序为什么这样设计? initstate…

大数据运维应用场景面试题汇总及参考答案(持续更新)

描述大数据环境下的数据备份和恢复策略。 在大数据环境下,数据备份和恢复策略是确保数据安全和业务连续性的关键措施。首先,备份策略需要根据数据的重要性、更新频率和业务需求来设计。对于关键数据,可能需要实施实时或近实时的备份,而对于不太重要的数据,则可以采用定期备…

解决npm run dev跑项目,发现node版本不匹配,怎么跑起来?【已解决】

首先问题点就是我们npm run dev 运行项目的时候发现出错,跑不起来,类型下面这种 这里的出错的原因在于我们的node版本跟项目的版本不匹配 解决办法 我这里的问题是我的版本是node14的,然后项目需要node20的,执行下面的就可以正…

html接入高德地图

1.申请key key申请地址&#xff1a;https://console.amap.com/dev/key/app 官方文档 https://lbs.amap.com/api/javascript-api-v2/summary 2.html接入示例 需要将YOUR_KEY替换成自己的key <!doctype html> <html> <head><meta charset"utf-…

python的抽象类和抽象方法

抽象类是一种不能直接被继承的类。举个例子&#xff0c;我们可以从类Creature衍生出类People&#xff0c;Cats&#xff0c;其中前者两条腿走路&#xff0c;后者四条腿走路&#xff0c;而单独的类Creature却没有一个几条腿走路的方法&#xff0c;因为这是不确定的。 &#xff0…

WebKit 入门介绍

WebKit的介绍 WebKit 是一个开源的浏览器引擎&#xff0c;主要用于处理和渲染网页内容。它包含了用于解析 HTML 和 CSS、构建及维护文档对象模型 (DOM)、渲染页面布局与图形、以及执行 JavaScript 脚本等一系列功能模块&#xff0c;旨在为用户提供快速、流畅且标准兼容…