python基础之Socket套接字详解

yizhihongxing

下面是对应的“python基础之Socket套接字详解”的完整攻略。

Python基础之Socket套接字详解

一、什么是Socket套接字

Socket套接字简称Socket,是提供应用程序和网络协议栈之间的接口,通过Socket可以方便地实现应用程序之间的数据传输和网络通信,比如HTTP、SSL、SSH、FTP等各种应用层协议都是基于Socket实现的。

二、Socket套接字基本使用方法

Python通过socket模块实现了Socket套接字的支持,可以很方便地编写网络应用,大致的使用方法如下:

1. 创建套接字

在创建一个基于Socket的网络应用之前,需要先创建一个Socket对象,可以在创建时指定协议族和套接字类型,如下所示:

import socket

# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

其中,AF_INET代表IPv4协议族,SOCK_STREAM代表流式Socket套接字类型。

2. 绑定并监听端口

绑定端口用于使客户端和服务端建立连接,端口可以是任意未被占用的端口。使用bind方法可以将端口绑定到Socket对象上。代码如下:

# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))

# 监听端口,等待客户端连接
s.listen(5)

此处将端口绑定到本地IP地址127.0.0.1的8080端口,并设置Socket对象的监听队列长度为5。

3. 建立连接

在服务端通过accept方法等待客户端连接,并且返回一个由客户端地址和端口组成的元组,使用该元组可以与客户端进行数据传输。代码如下:

# 等待客户端连接,返回一个由客户端地址和端口组成的元组
client, addr = s.accept()

4. 发送和接收数据

在Socket对象上,可以使用send方法向其它Socket对象发送数据,使用recv方法从其它Socket对象接收数据。用法如下:

# 发送数据
client.send('Hello World!')

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

# 关闭Socket对象
s.close()

在上述代码中,调用send方法向客户端Socket对象发送数据Hello World!,并使用recv方法接收客户端Socket对象返回的数据,数据的最大传输长度为1024字节。最后,使用close方法关闭Socket对象。

三、Socket套接字示例说明

下面,将通过两个示例对Socket套接字的使用方法进行说明,一个是简单的Echo服务器,另一个是简单的Web服务器。

1. Echo服务器

Echo服务器是一个简单的网络应用,它接收任何来自客户端的字符串,并将其原样返回给客户端。代码如下:

import socket

# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))

# 监听端口,等待客户端连接
s.listen(5)

while True:
    # 等待客户端连接,返回一个由客户端地址和端口组成的元组
    client, addr = s.accept()
    print('客户端已连接', addr)

    # 接收数据并将其发送回去
    data = client.recv(1024)
    client.send(data)

    # 关闭连接
    client.close()

在上述代码中,while循环表示程序可以不断接收来自客户端的连接请求,并在每次成功连接后接收数据并将数据原样返回给客户端。

2. 简单的Web服务器

简单的Web服务器可以接收HTTP GET请求并返回一份静态HTML页面。代码如下:

import socket

# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))

# 监听端口,等待客户端连接
s.listen(5)

while True:
    # 等待客户端连接,返回一个由客户端地址和端口组成的元组
    client, addr = s.accept()
    print('客户端已连接', addr)

    # 接收数据并解析HTTP请求
    data = client.recv(1024).decode()
    lines = data.split('\r\n')
    _, path, _ = lines[0].split()

    # 返回静态HTML页面
    with open('.' + path, 'rb') as f:
        content = f.read()

    header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\nConnection: close\r\n\r\n' % len(content)
    client.send(header.encode() + content)

    # 关闭连接
    client.close()

在上述代码中,程序在循环中等待客户端连接、接收数据、解析HTTP请求、返回静态HTML页面。为了简单起见,此处直接返回本地文件系统中存在的HTML页面,并没有进行路由和视图等开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python基础之Socket套接字详解 - Python技术站

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

相关文章

  • Python使用xlrd实现读取合并单元格

    下面是Python使用xlrd实现读取合并单元格的完整实例教程: 一、xlrd介绍 xlrd是Python的一个库,主要用于读取Excel文件,可以读取Excel的所有数据,包括单元格格式、公式等。官方文档地址:https://xlrd.readthedocs.io/en/latest/ 二、读取合并单元格 1. 安装xlrd库 使用pip安装命令安装xlr…

    python 2023年5月13日
    00
  • python3 中的几种除法介绍,小数的不同显示

    下面是 Python3 中几种除法的介绍: 1. Python3 中的两种除法 在 Python3 中,除法主要分为两种类型:整数除法和浮点数除法。 整数除法(//):这种除法会得到一个整数解,这个解是向下取整的商,结果不包含小数部分。 浮点数除法(/):这种除法会得到精确的商,结果一定包含小数部分,可以是浮点数型的。 下面分别对这两种除法做详细说明: a.…

    python 2023年6月3日
    00
  • 详解Python 获取原始数据

    接下来我会为您讲解Python获取原始数据的完整攻略,包括使用标准库和第三方库进行网络请求和解析HTML等步骤。 使用标准库 Python标准库中 urllib 库和 urllib2 库提供了进行网络请求的基本功能,可以通过以下步骤获取原始数据: 导入 urllib 库和 urllib2 库:在代码文件开始处添加以下行: import urllib impo…

    python-answer 2023年3月25日
    00
  • pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题

    以下是详细讲解“pycharm2020.2.4 pip install Flask报错Error: Non-zero exit code”的完整攻略。 问题描述 在使用Pycharm2020.2.4安装Flask模块时,会出现以下错误: ERROR: Command errored out with exit status 1: command: /usr/…

    python 2023年5月13日
    00
  • python调试器中的所有变量都未定义

    【问题标题】:all variables are undefined in python debuggerpython调试器中的所有变量都未定义 【发布时间】:2023-04-03 06:54:01 【问题描述】: 我在 Python 3.6 上遇到了一个非常奇怪的问题。在我的代码中间,我调用import pdb; pdb.set_trace() 来调试一些…

    Python开发 2023年4月8日
    00
  • python打开url并按指定块读取网页内容的方法

    要使用Python打开URL并读取网页内容,我们可以使用内置的urllib库。具体步骤如下: 引入urllib库 import urllib.request 使用urllib库中的urlopen函数打开URL url = "http://www.example.com" response = urllib.request.urlopen(…

    python 2023年6月3日
    00
  • pip报错“OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/typing_extensions.py’”怎么处理?

    当使用pip安装Python包时,可能会遇到“OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/typing_extensions.py’”错误。这个错误通常是由以下原因之一引起的: 用户权限不足:如果用户权限不…

    python 2023年5月4日
    00
  • 在Python中使用zlib模块进行数据压缩的教程

    下面是Python使用zlib模块进行数据压缩的详细教程及示例说明: 什么是zlib模块 zlib模块是Python标准库中提供的一种数据压缩库,可以用于对数据进行压缩和解压缩。它基于Zlib库,可用于处理大量数据并提供压缩比较高的压缩算法。 如何安装zlib模块 zlib模块在Python标准库中已经默认安装,因此不需要额外安装。 如何使用zlib模块进行…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部