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

Python Socket 编程示例 Echo Server的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  3. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  4. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  5. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...

  6. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  7. Python Socket 编程——聊天室演示样例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...

  8. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  9. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

随机推荐

  1. node升级更新最近稳定版

    今天,又发现一个超级简单的升级Node.js的方法.一行命令搞定,省去了重新编译安装的过程. node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: ...

  2. Spring IOC容器启动流程源码解析(四)——初始化单实例bean阶段

    目录 1. 引言 2. 初始化bean的入口 3 尝试从当前容器及其父容器的缓存中获取bean 3.1 获取真正的beanName 3.2 尝试从当前容器的缓存中获取bean 3.3 从父容器中查找b ...

  3. static 与 extern 关键字描述说明

    使用static 定义的变量和函数只能用于本模块即为本文件 使用extern 定义的变量和函数可以用于其他模块的引用

  4. curl模拟多线程抓取网页(优化)

    通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...

  5. KMP算法,查询匹配串的个数

    想不到时隔两年回来重新学习KMP算法还是那么难,不过理解了大概,把例程贴上来,如果是求数量只需要加个count变量记录即可. #include"stdio.h" #include& ...

  6. Socket发送文件

    .Net.cs using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sy ...

  7. 安装完 swoole 后出现 PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so'的解决方法

    安装完 swoole 后出现 PHP Warning:  PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /home/s ...

  8. Opencascade、OpenGL和OpenSceneGraph的区别与联系

    OpenGL只是三维显示 Openscenegraph基于场景图的概念,它提供一个在OpenGL之上的面向对象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出来 Opencascade更适合算 ...

  9. Shell编程-02-Shell变量

    目录 什么是Shell变量 变量类型 环境变量初始化及其对应文件的生效顺序 什么是Shell变量     在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的x和y称 ...

  10. 如何查看非自己提交的请求的结果 - 深入浅出Oracle EBS之杂项技术荟萃

    如何查看非自己提交的请求的结果定位要找的请求SQL举例:SELECT req.request_id,       fcp.user_concurrent_program_name,       usr ...