详解Python Socket网络编程

详解Python Socket网络编程

什么是Socket

Socket是网络编程中的一个概念,它指的是一组用于网络通信的API。我们可以用Socket在网络上发送数据和接收数据。

在Python中,我们可以使用socket模块来创建和操作Socket。socket模块提供了一个类来表示一个网络套接字socket对象。

Socket的工作原理

Socket通常用于客户端和服务器之间的传输,而服务器会一直处于监听状态,然后从世界上的任何一台计算机的客户端接收连接。

在通过网络 Socket 向服务器发送请求时,首先创建一个客户端 Socket 对象,然后客户端 Socket 将数据发送到服务器,最后客户端 Socket 关闭连接。

在接收请求时,服务器首先创建一个服务器 Socket 等待客户端请求,然后客户端Socket创建后,服务器Socket接受客户端 Socket 请求,并将数据发送到客户端 Socket,最后服务器 Socket 关闭连接。

Socket的类型

下面是Python中用到的几种Socket类型:

  • SOCK_STREAM: TCP流式Socket,提供一个连续的、可靠的数据流。
  • SOCK_DGRAM: UDP数据报Socket,提供无连接、固定长度的数据报式服务。

创建一个Socket对象

创建一个Socket对象的示例代码如下:

import socket

# 创建TCP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建UDP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

在创建Socket对象时,我们可以通过传递一个域AF_INET和一个类型SOCK_STREAMSOCK_DGRAM来指定Socket的类型。

设置Socket参数

我们可以设置Socket参数以控制其行为。下面是设置Socket参数的示例代码:

import socket

# 创建Socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 设置超时时间为10秒
sock.settimeout(10)

在这个例子中,我们使用了settimeout()方法来设置超时时间,如果Socket对象在10秒内无响应,则会抛出timeout异常。

连接远程主机

我们可以使用Socket对象的connect()方法来连接远程主机,示例代码如下:

import socket

# 创建TCP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接远程主机
sock.connect(('example.com', 80))

在这个示例中,我们使用了connect()方法来连接主机example.com的TCP服务端口80。

发送/接收数据

我们可以使用Socket对象的send()recv()方法来在网络上发送和接收数据,示例代码如下:

import socket

# 创建TCP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接远程主机
sock.connect(('example.com', 80))

# 发送数据
sock.send('Hello, world!')

# 接收数据
data = sock.recv(1024)

在这个示例中,我们首先使用connect()方法连接主机example.com的TCP服务端口80,然后使用send()方法向主机发送数据,并使用recv()方法从主机接收数据。

示例1:创建一个简单的TCP服务器

最简单的TCP服务器代码示例如下:

import socket

# 创建TCP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP和端口
sock.bind(('localhost', 8000))

# 设置最大连接数为1
sock.listen(1)

while True:
    # 等待客户端连接
    client_socket, addr = sock.accept()

    # 接收客户端发送的数据
    data = client_socket.recv(1024)

    # 发送响应给客户端
    client_socket.send('HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nHello, world!')

    # 关闭客户端连接
    client_socket.close()

在这个示例中,我们首先创建了一个TCP Socket,并将其绑定到本地IP地址127.0.0.1和端口8000,然后使用listen()方法启动服务器并设置最大连接数为1。

接下来,我们使用一个循环来等待客户端的连接,一旦客户端连接成功,我们就使用accept()方法接受连接并返回一个新的Socket对象和客户端的地址。然后我们使用recv()方法来从客户端接收数据,使用send()方法将响应发送回客户端,最后使用close()方法关闭客户端连接。

示例2:创建一个简单的UDP服务器

最简单的UDP服务器代码示例如下:

import socket

# 创建UDP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定IP和端口
sock.bind(('localhost', 8000))

while True:
    # 接收客户端发送的数据
    data, addr = sock.recvfrom(1024)

    # 发送响应给客户端
    sock.sendto('Hello, world!', addr)

在这个示例中,我们首先创建了一个UDP Socket,并将其绑定到本地IP地址127.0.0.1和端口8000。

然后我们使用一个循环来等待客户端的数据包到达。一旦客户端发送了数据包,我们就使用recvfrom()方法接收数据和客户端的地址。然后使用sendto()方法将响应发送回客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python Socket网络编程 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • pip报错“ValueError: invalid literal for int() with base 10: ‘2.3’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ValueError: invalid literal for int() with base 10: ‘2.3’”错误。这个错误通常是由以下原因之一引起的: 版本号格式不正确:如果版本号格式不正确,则可能会出现此错误。在这种情况下,需要更改版本号格式。 包依赖关系不正确:如果包依赖关系不正确,则可能会出现此错误…

    python 2023年5月4日
    00
  • python 重定向获取真实url的方法

    在Python中,我们经常需要获取网页的真实URL,以便进行后续的处理。有时候,网页的URL会被重定向到其他URL,这时候我们需要获取重定向后的真实URL。本文将详细讲解Python重定向获取真实URL的方法,包括使用requests库和urllib库的示例代码。 使用requests库获取真实URL requests库是Python的HTTP库,可以方便地…

    python 2023年5月15日
    00
  • 详解Python 函数式复合和柯里化

    Python 函数式编程中,函数复合和柯里化是两种常见的方法,可以帮助我们更加高效地编写程序。下面对这两种方法进行详细讲解。 函数式复合 函数复合是指将多个函数组合成一个新函数的过程,在Python中可以使用 compose 函数进行实现。compose 函数接受一个可变参数,其中每个参数都是一个函数,返回值是一个新的函数。 我们可以通过以下的代码实现 co…

    python-answer 2023年3月25日
    00
  • Python爬虫和反爬技术过程详解

    Python爬虫和反爬技术过程详解 1. 爬虫过程 1.1 网页请求 在Python中,我们可以使用第三方库如requests、urllib等发起网页请求,获取目标网页的HTML源代码。通过requests库发起文本形式的GET请求方法可以获得目标网站的的HTML页面,如下例所示: import requests response = requests.ge…

    python 2023年5月14日
    00
  • Python – 文件处理 – 无法将’int’对象隐式转换为str [重复]

    【问题标题】:Python – File handling – Can’t convert ‘int’ object to str implicitly [duplicate]Python – 文件处理 – 无法将’int’对象隐式转换为str [重复] 【发布时间】:2023-04-06 11:31:01 【问题描述】: 我正在尝试将冒险游戏的故事从文件读…

    Python开发 2023年4月6日
    00
  • Python中的sys模块、random模块和math模块

    Python 是一种广泛使用的编程语言,内置各种模块扩展其功能。其中,sys、random和math是 Python 内置的常用模块。在本文中,我将深入探讨这三个模块。 Sys 模块 sys 模块提供了许多与 Python 解释器相关的函数。下面是一些常用函数: sys.argv sys.argv是一个字符串列表,包含命令行参数。第一个命令行参数是脚本名称。…

    python 2023年6月2日
    00
  • Python 实现把列表中的偶数变成他的平方

    在Python中,可以使用列表推导式来实现将列表中的偶数变成它的平方。下面将介绍两个示例,分别演示了如何使用列表推导式将列表的偶数变成它的平方。 示例一:将列表中的偶数变成它的平方 # 将列表中的偶数变成它的平方 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] new_lst = [x**2 if x%2==0 else x fo…

    python 2023年5月13日
    00
  • 使用python在特定条件下将文本添加到PDF文件名

    【问题标题】:Adding text to PDF file name under specific conditions using python使用python在特定条件下将文本添加到PDF文件名 【发布时间】:2023-04-07 21:33:01 【问题描述】: 我正在尝试在特定条件下编辑 pdf 的文件名。 名称是根据输入数据库的数字生成的(不可更…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部