资讯专栏INFORMATION COLUMN

Python Socket 编程示例 Echo Server

leoperfect / 562人阅读

摘要:可以是主机名地址或空字符串。如果传递空字符串,则服务器将接受所有可用接口上的连接。应为之间的整数被保留,它是接受来自客户端连接的端口号,如果端口号,某些系统可能需要超级用户权限。

简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单地回显它接收到客户端的任何内容。本文将详细解释服务器部分的代码。
下面是服务器代码保存到 echo-server.py文件:
#!/usr/bin/env python3

import socket

HOST = "127.0.0.1"  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print("Connected by", addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

socket.socket()创建一个支持上下文管理器类型的 socket 对象,因此可以在 with 语句中使用它,没有必要去调用 s.close():

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    pass  # Use the socket object without calling s.close().

传递给socket()的参数指定地址族和 socket 类型。 AF_INET 指的是 IPv4 的网络地址。 SOCK_STREAM是 TCP 的 socket 类型,TCP 用于在网络中传输消息。

bind()用于将 socket 与特定网络接口和端口号相关联:

HOST = "127.0.0.1"  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

# ...

s.bind((HOST, PORT))

传递给bind()的值取决于 socket 的地址族。在这个例子中,我们使用的是socket.AF_INET(IPv4)所以它接受一个(host, port)元组。

host 可以是主机名、IP 地址或空字符串。如果使用 IP 地址,则主机应为 IPv4 格式的地址字符串,127.0.0.1 是环回接口的标准 IPv4 地址,因此只有主机上的进程才能连接到服务器。如果传递空字符串,则服务器将接受所有可用 IPv4 接口上的连接。

port 应为 1-65535 之间的整数(0 被保留),它是接受来自客户端连接的 TCP 端口号,如果端口号 <1024,某些系统可能需要超级用户权限。

listen()使服务器能够 accept()连接,这使它成为一个「listening」socket:

s.listen()
conn, addr = s.accept()

accept()阻塞并等待传入请求连接。当客户端连接时,它返回一个表示连接的 socket 对象和一个保存客户端地址的元组,该元组包含用于 IPv4 连接的(host, port)或用于 IPv6的(host, port, flowinfo, scopeid)。

必须要理解的一件事是我们现在有一个来自accept()的新 socket 对象,这很重要,因为它是用于与客户端通信的 socket,它与服务器用于接受新连接的侦听 socket 不同:

conn, addr = s.accept()
with conn:
    print("Connected by", addr)
    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)

从accept()获取客户端 socket 对象conn后,使用无限循环来循环阻塞对 conn.recv()的调用。这将读取客户端发送的任何数据,并使用 conn.sendall()将其回送回来。

如果conn.recv()返回一个空字节对象b"",则客户端关闭连接并终止循环。 with 语句与 conn 一起使用以自动关闭块末尾的 socket。

原文:Socket Programming in Python (Guide) – Real Python

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42505.html

相关文章

  • Socket 编程实战

    摘要:本文原发于个人博客在英文中的含义为连接两个物品的凹槽,像,意为眼窝,此外还有插座的意思。协议,所是用的传输协议,目前有三种。,也称为无连接的,使用协议。当函数返回时,意味着对端已经关闭。 本文原发于个人博客 Socket 在英文中的含义为(连接两个物品的)凹槽,像the eye socket,意为眼窝,此外还有插座的意思。在计算机科学中,socket 通常是指一个连接的两个端点,这里的...

    TNFE 评论0 收藏0
  • [译]Python 中的 Socket 编程(指南)

    摘要:当一个客户端连接时,它将返回一个新的对象,对象中有表示当前连接的和一个由主机端口号组成的连接的元组,更多关于元组值的内容可以查看地址族一节中的详情这里必须要明白我们通过调用方法拥有了一个新的对象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 说明 本书翻译自 realpython 网站上的文章教程 ...

    sushi 评论0 收藏0
  • Python Socket Programming

    摘要:中却发生了异常。接收数据使用函数接收数据在中返回的是对象,在中返回的是。注意函数返回的数据长度是小于或者等于参数指定的长度的,要接收到指定长度的数据,需要循环接收数据。当一个被回收时会自动关闭,但是不要依赖这种机制,不需要时就主动的。 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在...

    luqiuwen 评论0 收藏0
  • python socket编程的初探

    摘要:对于网络编程来说,免不了要用到模块。表示另一端的地址。以上主要是针对流数据的编程。对于协议的数据,处理略有不同。通过传入对象调用来监听对象的文件描述符,一旦发现对象就绪,就通知应用程序进行相应的读写操作。 对于python网络编程来说,免不了要用到socket模块。下面分享一下个人对python socket的一些理解。 socket编程步骤 服务端创建一个socket,绑定地址和端...

    stormgens 评论0 收藏0
  • PHP回顾之socket编程

    摘要:如果你想体验原味编程,用开头的比较适合否则建议使用流函数。有关流的知识,请参考本人之前的博文回顾之流。接下来我们用流函数实现一个简单的客户端和服务端。流函数中的和两个函数是我们想要的。本文目的是简要介绍中的编程,行文到此已经达到目的。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie w...

    tomorrowwu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<