程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

[868]ScalersTalk成长会Python小组第16周学习笔记

hfteth 2025-06-13 13:25:42 技术文章 4 ℃

Scalers点评:在2015年,ScalersTalk成长会Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。

我们的节奏是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。

往期日志:

本周学习情况

本周(20160508-20160515)学习第十六章,章节内容为网络编程。本周复盘主持人为sophie。

本周主要内容

本周主要学习了Python的网络编程,是后面几章深入学习的基础。首先介绍了客户端/服务器架构,套接字,面向连接(TCP)与无连接(UDP)。然后练习了在Socket模块和SocketServer模块下创建TCP与UDP的服务器/客户端架构。

预备知识

  1. 客户端/服务器架构

  • 硬件的客户端/服务器架构:打印机服务器,文件服务器…

  • 软件客户端/服务器架构;Web服务器,软件服务器,窗口服务器

  • 客户端和服务器通过一个通信端点连接

套接字—通信端点

  • socket是操作系统I/O系统的延伸部分,它扩展了操作系统的基本I/O到网络通信,使 进程和机器之间的通信成为可能。建立 socket 需要通过调用 socket 函数,并且还需要另外的调用来连接和激活它们( recv 和 send )

  • 基于文件型的Unix套接字:AF_UNIX

  • 基于网络的套接字: AF_INET

  • 主机与端口

面向连接与无连接/TCP与UDP

  • TCP的通信方式通信前要建立一条连线,提供了顺序的、可靠的、不会重复的数据传输。而UDP无需建立连接就可以通讯,但数据到达的顺序,可靠性及不重复性无法保证

  • 当socket建立的时候,TCP程序调用的是SOCK_STREAM,UDP调用的是SOCK_DGRAM

  • UDP程序没有办法探测服务器什么时候发送完数据。这是因为这里其实没有什么实际的连接。对connect的调用只是初始化了一些内在参数。同时,服务器也许不会返回任何数据,或者数据也许在传输过程中丢失,程序并没有智能地判断这个问题

socket模块函数.

  • socket模块函数

    socket(socket_family,socket_type,protocol=0)

  • 创建一个TCP/IP的套接字

    tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  • 创建一个UDP/IP的套接字

    udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  • 使用from socket import* 将socket模块导入,可以大幅减少代码

    tcpSock = socket(AF_INET, SOCK_STREAM)

    udpSock = socket(AF_INET, SOCK_DGRAM)

socket 对象(内建)方法

常用的套接字函数:

socket.accept 它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个单独的客户端套接字(例程中的tcpCliSock)用于后续的通信,主端口空出来接受其他客户端的请求。

socket.recv/send:一个是向指定地址发送,一个是获得。

Python中的网络编程-TCP

  1. 创建一个TCP服务器

     ss = socket # 创建服务器套接字 ss.bind # 把地址绑定到套接字上 ss.listen # 监听服务器 inf_loop: # 服务器无限循环 cs = ss.accept # 接受客户端连接 comm_loop: # 通信循环 cs = ss.recv/ss.send # 对话 cs.close # 关闭客户端套接字 ss.close # 关闭服务器套接字’

    在Python中,利用Socket编写服务器和客户端通信程序,经常会遇到一个错误:

    socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次

    这个提示会在端口冲突的时候出现,可能的原因是在服务器程序中创建一个Socket打 开一个端口后,在程序结束的时候没有关闭这个Socket,因此下次启动程序就会出现这个错误提示,解决方法:

  • 在服务器程序结束的时候要关闭Socket

  • 或者更换端口号

  • 重启机器

创建TCP客户端

 cs = socket # 创建客户端套接字 cs.connet # 尝试连接服务器 comm_loop: # 通信循环 cs.recv/cs.send #对话 cs.close #关闭客户端套接字

3. 运行我们的客户端与TCP服务器 先开服务器,后开客户端

Python中的网络编程-UDP

1.创建一个UDP服务器

ss = socket # 创建一个服务器套接字 ss.bind # 绑定服务器套接字 inf_loop: # 服务器无限循环 cs = ss.recvfrom/ss.sendto # 对话 ss.close

2.创建一个UDP客户端

3.运行我们的客户端与TCP服务器先开服务器,后开客户端

Python中的网络编程-SocketServer模块

SocketServer是标准库中一个较高级的模块。用来简化实现网络客户端与服务器所需的大量样板代码。

1.创建SocketServerTCP服务器与不使用该模块的区别:在服务器循环中,不在服务器中写代码,改成定义一个处理器。

from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
class MyRequestHandler(SRH): def handle(self): print '...connected from:', self.client_address self.wfile.write('[%s]%s'%(ctime,self.rfile.readline)) tcpServ = TCP(ADDR, MyRequestHandler)

2.创建SocketServerTCP客户端

SocketTCP客户端

SocketServerTCP客户端

通过对比SocketTCP客户端程序和SocketServerTCP客户端程序,可以发现SocketServer中的套接字建立在无限循环内部。SocketServer 的请求处理器的默认行为是接受连接,得到请求,然后就关闭连接。这使得我们不能在程序的运行时,一直保持连接状态,要每次发送数据到服务器的时候都要创建一个新的套接字。

3.执行客户端与TCP服务器与之前的TCP客户与服务器类似,但是连接了服务器两次

总结-建立网络服务器

1.服务器的特点是等待来自客户端的请求,发送应答。与客户端类似,使用的是和客户端同样的socket接口。建立socket:首先需要建立一个实际的socket对象,其次需要把它连接到远程服务器上。建立socket对象的时候需要告诉系统两件事情:通信协议和协议家族。

  • 通信协议:Internet通信类型基本上都是AF_INET,和 IPv4 对应。

  • 协议家族:SOCK_STREAM ( TCP通信 ) 或 SOCK_DGRAM ( UDP通信 )

TCP建立socket连接:

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

UDP建立socket连接:

s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )

2.设置socket选项(可选)。

s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )

3.绑定到一个端口(同样,也可以是一个指定的网卡)。bind函数第一个参数是你要绑定的IP地址,通常为空,意思是可以绑定到所有的接口和地址。

s.bind(( host, port ))

4.侦听连接。唯一参数指明了服务器实际处理连接的时候,允许有多少个未决(等待)的连接在队列中等待。

s.listen(5)

5.接受连接。

通常服务器连续运行的办法是设计一个无限循环。这里的循环是:当你调用 accept 的时候,它只在有一个客户端连接后才返回,同时程序会停止,并不使用任何CPU资源。

在服务器端使用UDP,可以像使用TCP一样建立一个socket, 设置选项,并调用 bind 函数。然而,不必使用 listen 或 accept 函数,仅仅使用 recvfrom 函数就可以了。这个函数实际上会返回两个信息:收到的数据,以及发送这些数据的程序地址和端口号。

总结-建立网络客户端

1.客户端使用的是和服务器同样的socket接口

2.连接socket:一般需要一个tuple,包含远程主机名( 或IP地址) 和远程端口。连接一个socket一般使用如下代码:

ADDR = (HOST,PORT) s.connect(ADDR)

3.利用socket通信

python提供了两种通信方法:socket对象和文件类对象。

socket 对象提供了操作系统的 send, sendto, recv, recvfrom 调用的接口。

文件类对象则提供了 read, write readline 等python接口。

相关模块

  1. select模块

    select-在单线程网络服务中器程序中,管理多个套接字连接

    select的原型为(rlist,wlist,xlist[,timeout]),其中rlist是等待读取的对象,wlist是等待写入的对象,xlist是等待异常的对象,最后一个是可选对象,指定等待的时间,单位是s. select方法的返回值是准备好的对象的三元组,若在timeout的时间内,没有对象准备好,那么返回值将是空的列表。

    它采用的是轮询的方式来实现异步通信的。

Tags:

最近发表
标签列表