【python学习】中级篇-TCP编程Socket模块:客户端与服务端

客户端

  1. 创建一个基于TCP连接的Socket
    AF_INET指定使用IPv4协议
    AF_INET6指定使用IPv6协议
# 导入socket库:
import socket# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
  1. 客户端要主动发起TCP连接
    必须知道服务器的IP地址和端口号
    连接新浪服务器
# 连接服务器
s.connect(('www.sina.com.cn', 80))

服务都有对应的标准端口号,
Web服务是80端口,
SMTP服务是25端口,
FTP服务是21端口,
端口号小于1024的是Internet标准服务的端口,
端口号大于1024的,可以任意使用。

  1. 建立TCP连接后,发送请求
# 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
  1. 接收数据
# 接收数据:
buffer = []
while True:# 每次最多接收1k字节:d = s.recv(1024)if d:buffer.append(d)else:break
data = b''.join(buffer)

接收数据时,调用recv(max)方法,一次最多接收指定的字节数,
因此,在一个while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环。

接收到的数据包括HTTP头和网页本身,我们只需要把HTTP头和网页分离一下,
把HTTP头打印出来,网页内容保存到文件:

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:f.write(html)

在浏览器中打开这个sina.html文件,就可以看到新浪的首页了。
5.关闭Socket,通信结束

# 关闭连接:
s.close()

服务器端

服务器进程首先要绑定一个端口并监听来自其他客户端的连接。
如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。
一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。

编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去

  1. 创建一个基于IPv4和TCP协议的Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1. 绑定监听的地址和端口
    用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址。
    127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接
# 绑定端口:
s.bind(('127.0.0.1', 9999))
  1. 监听端口
    传入的参数指定等待连接的最大数量
s.listen(5)
print('Waiting for connection...')
  1. 接受客户端连接
    服务器程序通过一个永久循环来接受来自客户端的连接
while True:# 接受一个新连接:sock, addr = s.accept()# 创建新线程来处理TCP连接:t = threading.Thread(target=tcplink, args=(sock, addr))t.start()
  1. 多进程接受连接
    每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接
    连接建立后,服务器首先发一条欢迎消息,然后等待客户端数据,并加上Hello再发送给客户端。如果客户端发送了exit字符串,就直接关闭连接
def tcplink(sock, addr):print('Accept new connection from %s:%s...' % addr)sock.send(b'Welcome!')while True:data = sock.recv(1024)time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))sock.close()print('Connection from %s:%s closed.' % addr)
  1. 退出服务器程序
    服务器程序会永远运行下去,必须按Ctrl+C退出程序。

  2. 测试所需的客户端程序:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:# 发送数据:s.send(data)print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/162976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022-1-25 机器人运动规划方法综述 航空学报

论文PDF abstract 随着应用场景的日益复杂,机器人对旨在生成无碰撞路径(轨迹)的自主运动规划技术的需求也变得更加迫 切。虽然目前已产生了大量适应于不同场景的规划算法,但如何妥善地对现有成果进行归类,并分析不同…

Spark---基于Standalone模式提交任务

Standalone模式两种提交任务方式 一、Standalone-client提交任务方式 1、提交命令 ./spark-submit --master spark://mynode1:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100 或者 ./spark-submit --master spark…

给数据库查询结果添加一个额外的自增编号

1、在mysql数据库可以执行的sql SELECT( i : i 1 ) num,M.* FROMuser M,( SELECT i : 0 ) AS ID GROUP BYM.ID ORDER BYM.create_time SELECT (i :i 1) 是为了生成自增的序列号字段 SELECT i : 0 是为了将i进行初始化每次查询的序列号都会从1开始进行排序生成序列号 在…

go sync.map源码解读

此源码理解仅为个人理解,如有错误欢迎指出 sync.map的数据结构主要包含四个字段 一个互斥锁,readonly,dirty,和miss 从读写两个方面来讲这几个变量 readonly其实就是有bool值的dirty,底层结构都是map readonly的读更新不会上锁&#xff0c…

在springboot中实现WebSocket协议通信

前面介绍了使用netty实现websocket通信,有些时候,如果我们的服务并不复杂或者连接数并不高,单独搭建一个websocket服务端有些浪费资源,这时候我们就可以在web服务内提供简单的websocket连接支持。其实springboot已经支持了websock…

20230511 Windows Ubuntu vscode remote-ssh 连接配置

参考 : VSCode SSH 连接远程ubuntu Linux 主机 VSCode通过Remote SSH扩展连接到内网Ubuntu主机 Ubuntu 安装 sudo apt-get install openssh-server vscode: 安装remote-ssh 插件 连接到服务器IP 免密登录的公钥密钥传递用filezillaUbuntu 和 Windows 文件互传 …

PMP对项目工程师有用吗?

一、什么是项目工程师? 项目工程师是指在各个领域负责技术操作、设计、管理以及评估能力的人员。他们通常担当项目的实施和执行角色,在开发或控制类项目中发挥重要作用。有时,项目工程师的称号还可以用来表示在某个领域取得专业资格的人员。…

深入理解路由协议:从概念到实践

路由技术是Internet得以持续运转的关键所在,路由是极其有趣而又复杂的课题,永远的话题。 SO:这是一个解析路由协议的基础文章。 目录 前言路由的概念路由协议的分类数据包在网络中的路由过程理解路由表的结构路由器关键功能解析 前言 在互联…

PTA-字符串的连接

本题要求实现一个函数&#xff0c;将两个字符串连接起来。 函数接口定义&#xff1a; char *str_cat( char *s, char *t ); 函数str_cat应将字符串t复制到字符串s的末端&#xff0c;并且返回字符串s的首地址。 裁判测试程序样例&#xff1a; #include <stdio.h> #inc…

SQL Server数据库自动备份方法

要编写一个自动备份 SQL Server 数据库的脚本&#xff0c;可以使用 SQL Server Management Studio (SSMS) 或者 Transact-SQL (T-SQL) 脚本。以下是一个简单的 T-SQL 脚本示例&#xff0c;该脚本将数据库备份到指定的文件路径&#xff1a; -- 设置要备份的数据库名称 DECLARE D…

求解Beamforming-SOCP(CVX求解)

时间&#xff1a;2023年11月23日14:00:16&#xff1a; 直接上代码&#xff08;辛苦两天才改出来的&#xff09; clear all; K 4; %user number N4; %base station number var1e-9; H []; %initialize H matrix for i1:Kh 1/sqrt(2*K)*mvnrnd(zeros(N,1),eye(N),1)1i/sqrt(2*…

【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )

文章目录 一、类模板使用流程1、类模板 定义流程2、类模板 使用3、类模板 函数 外部实现 二、类模板 static 关键字1、类模板 static 静态成员2、类模板 static 关键字 用法3、完整代码示例 将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明…

数据结构 二叉树

二叉树 二叉树是n个有限元素的集合&#xff0c;该集合或者为空、或者由一个称为根&#xff08;root&#xff09;的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成&#xff0c;是有序树。当集合为空时&#xff0c;称该二叉树为空二叉树。在二叉树中&#xff0c;一个…

【8】Spring Boot 3 集成组件:安全组件 spring security【官网概念篇】

目录 【8】Spring Boot 3 集成组件&#xff1a;安全组件 spring securitySpring Security 简介先决条件引入依赖身份验证密码存储密码存储历史DelegatingPasswordEncoder密码存储格式密码加解密类自定义密码存储 体系结构 ArchitectureServlet 过滤器DelegatingFilterProxyFilt…

第二十章 多线程

20.2创建线程 20.2.1继承Thread类 Thread类是Java.lang包中的一个类&#xff0c;从这个类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建议Thread实例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1让线程循…

mysql命令导出表结构和数据

MySQL是一款流行的关系型数据库管理系统&#xff0c;是许多公司和组织使用的首选数据库。在日常使用中&#xff0c;我们经常需要对数据库进行备份和复制&#xff0c;因此必须了解如何导出表结构和表数据。以下是使用MySQL命令导出表结构和表数据的方法。 1. 导出表结构 mysql…

AnalyticDB for PostgreSQL 实时数据仓库上手指南

AnalyticDB for PostgreSQL 实时数据仓库上手指南 2019-04-016601 版权 本文涉及的产品 云原生数据仓库 ADB PostgreSQL&#xff0c;4核16G 50GB 1个月 推荐场景&#xff1a; 构建的企业专属Chatbot 立即试用 简介&#xff1a; AnalyticDB for PostgreSQL 提供企业级数…

iOS合并代码后解决冲突

合并主干和分支代码后有冲突&#xff0c;xcode无法运行&#xff0c;如下图&#xff1a;文件显示不了&#xff0c;项目名也显示不了 解决冲突&#xff1a; 1.选中左边目录栏的项目名。鼠标右键--> Show in Finder 2.选中项目文件 xxxx.xcodeproj。鼠标右键--> 显示包内容…

【python学习】中级篇-绘制图形:turtle库

turtle库是Python的一个绘图库&#xff0c;它提供了一个简单的绘图窗口&#xff0c;可以让你通过控制一个小海龟在屏幕上移动来绘制图形。 以下是一个简单的turtle库用法示例&#xff1a; 在这个示例中&#xff0c;我们首先导入了turtle库&#xff0c;然后创建了一个画布和一个…

【创建一个C++线程需要传入几个参数?】

在C++中,创建一个std::thread对象时,你可以传递多个参数,但至少需要一个参数:线程将要执行的函数。这个函数可以是一个普通函数、一个类的成员函数,或者一个可调用对象(如lambda表达式)。除了要执行的函数之外,你还可以传递任何数量的参数,这些参数将被转发到线程函数…