简评:我们已经从「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。

python回声程序echo 一行代码_Python Socket 编程示例 Echo Server相关推荐

  1. python怎么返回上一行代码_Python实现判断一行代码是否为注释的方法

    目前的编辑器大都可以自动检测某一行代码是否为代码行或注释行,但并不太提供代码行/注释行行数的统计,对于大量代码文件的代码行/注释行统计,就更少见一些.本篇文章试用一段Python脚本来实现这一目标,并 ...

  2. python实现简易聊天需要登录_python socket编程 实现简单p2p聊天程序

    目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...

  3. python只能用一行代码_Python 一行代码能实现丧心病狂的功能

    手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建.基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道 ...

  4. python可以实现什么炫酷图形吗_我是Python小玩家,一行代码能做哪些炫酷的事情?...

    python之禅 image 一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 python3 -m http.server 8080 一行代码实现变量值互换 ...

  5. python用一行代码编写一个回声程序_一行python代码实现树结构

    树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题 ...

  6. python生成二维码代码_python 一行代码生成 二维码

    效果图如上:动态二维码,彩色二维码,黑白二维码: 看到别人做的炫酷二维码,瞬间心动,想动手做个 自己的炫酷二维码. github上有大神 做的框架,直接拿来用,安装工具 myqr: pip insta ...

  7. Python高级技巧:用一行代码减少一半内存占用!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 内存不足是项目开发过程中经常碰到的问题,我和我的团队在之前的一个项目中也遇到了这个问题 ...

  8. python课设代码_python课程编程题汇总(上)

    python编程题汇总 众所周知,由于疫情的原因,大家都在上网课,我也不例外啦~ 用这个贴子来记录也和大家分享一下我们课上的编程讨论题 中篇在此→python课程编程题汇总(中) 下篇在此→pytho ...

  9. python同时注释多行代码_python怎么同时对多行代码进行注释

    学会向程序中添加必要的注释,也是很重要的.注释不仅可以用来解释程序某些部分的作用和功能(用自然语言描述代码的功能),在必要时,还可以将代码临时移除,是调试程序的好帮手. 当然,添加注释的最大作用还是提 ...

最新文章

  1. gpu的单位表示_GPU是如何工作的
  2. 图形处理(二)固定边界参数化
  3. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
  4. 【SICP归纳】6 副作用与环境模型
  5. python找思路_python 爬取贝壳的一些思路和方法设计(用地址找到小区名字)
  6. LVS+ldirector实现负载均衡
  7. python3 logging模块_python3中使用logging模块写日志,中文乱码,如何解决?
  8. 9.使用 curses 函数库来管理基于文本的屏幕
  9. 5-9 第五天 微信 JS-SDK-使用微信官方的WEB调试工具
  10. 微型计算机控制技术扫描,微型计算机控制技术(双色)
  11. Java基础语法(详细版)
  12. Python之网络编程学习笔记
  13. dBm 转 W 换算
  14. 科大讯飞测试开发工程师面试
  15. PhotoShop制作gif动态广告效果示例
  16. 算法岗和开发岗有什么区别?
  17. 搜索中文与外文数据库中的综述类文献
  18. linux 下的字体引擎(xtt freetype xfs xft)
  19. 计算机无法加载引导,硬盘找不到无法读取MBR(硬盘的主引导记录)故障分析及解决技巧...
  20. 细说php作者高洛峰免费收徒

热门文章

  1. Unity编辑器内搜索小技巧
  2. 记录问题:No startup URLs supplied and no plausible ones found -- use -startupUrl
  3. 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环
  4. 美摄科技受邀LVSon2020大会 分享《AI合成虚拟人物的技术框架与挑战》
  5. 华为的Linux系统和win系统,公认最美国产操作系统Deepin已与华为合作能替代windows?...
  6. CUBASE11教程笔记。
  7. 在线作图|2分钟轻松绘制ROC曲线
  8. 城乡投票源码php_PHP发表心情投票功能示例(附源码)
  9. ValueError: GetLogdirSubdirectories: path exists and is not a directory
  10. Linux系统安全:安全技术和防火墙