python-网络编程(Python网络编程第三版)

网友投稿 342 2022-07-30

正文

一:socket和套接字

回到顶部

1.1.什么是socket

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

回到顶部

1.2.套接字分类

这个世界上有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。

回到顶部

1.3.Internet 套接分类

Internet 套接字分成两种类型:

流格式套接字(Stream Sockets)也叫“面向连接的套接字”,在代码中使用 SOCK_STREAM 表示。

数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。

回到顶部

1.4.无连接套接字

数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。

计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。

因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。

可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:

回到顶部

1.5.有连接套接字

SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。

SOCK_STREAM 有以下几个特征:

数据在传输过程中不会消失;

数据是按照顺序传输的;

数据的发送和接收不是同步的(有的教程也称“不存在数据边界”)。

为什么流格式套接字可以达到高质量的数据传输呢?这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。

你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

可以将 SOCK_STREAM 比喻成一条传送带,只要传送带本身没有问题(不会断网),就能保证数据不丢失;同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。

那么,“数据的发送和接收不同步”该如何理解呢?

  假设传送带传送的是水果,接收者需要凑齐 100 个后才能装袋,但是传送带可能把这 100 个水果分批传送,比如第一批传送 20 个,第二批传送 50 个,第三批传送 30 个。接收者不需要和传送带保持同步,只要根据自己的节奏来装袋即可,不用管传送带传送了几批,也不用每到一批就装袋一次,可以等到凑够了 100 个水果再装袋。

  流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。

  也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。

面向连接的套接字通信工作流程

  (1)服务器先用socket函数来建立一个套接字,用这个套接字完成通信的监听

  (2)用bind函数来绑定一个端口号和IP地址。因为本地计算机可能有多个IP,每一个IP有多个端口号,需要指定一个IP和端口进行监听

  (3)服务器调用listen函数,使服务器的这个端口和IP出于监听状态,等待客户机的连接

  (4)客户机用socket建立一个套接字

  (5)客户机调用connect函数,通过远程IP和端口号连接远程计算机指定的端口

  (6)服务器用accept函数来接收远程计算机的连接,建立起与客户端之间的通信

  (7)建立连接以后,客户机用write函数向socket中写入数据。也可用read函数读取服务器发送来的数据

  (8)服务器用read函数读取客户机发送来的数据,也可用write函数发送数据

  (9)完成通信以后,用close函数关闭socket连接

回到顶部

二:python中的网络编程

回到顶部

2.1.socket()模块函数

要创建套接字,必须使用socket.socket()函数。

1

2

3

form socket import *

 

tcpsock = socket(AF_INTE, SOCK_STREMA)

回到顶部

2.2.套接字对象(内置)方法

常见的套接字对象方法和属性

名 称

描 述

服务器套接字方法

s.bind()

将地址(主机名、端口号对)绑定到套接字上

s.listen()

设置并启动 TCP 监听器

s.accept()

被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞)

客户端套接字方法

s.connect()

主动发起 TCP 服务器连接

s.connect_ex()

connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常

普通的套接字方法

s.recv()

接收 TCP 消息

s.recv_into()①

接收 TCP 消息到指定的缓冲区

 

s.send()

发送 TCP 消息

s.sendall()

完整地发送 TCP 消息

s.recvfrom()

接收 UDP 消息

s.recvfrom_into()①

接收 UDP 消息到指定的缓冲区

s.sendto()

发送 UDP 消息

s.getpeername()

连接到套接字(TCP)的远程地址

s.getsockname()

当前套接字的地址

s.getsockopt()

返回给定套接字选项的值

s.setsockopt()

设置给定套接字选项的值

s.shutdown()

关闭连接

s.close()

关闭套接字

s.detach()②

在未关闭文件描述符的情况下关闭套接字,返回文件描述符

s.ioctl()③

控制套接字的模式(仅支持 Windows)

面向阻塞的套接字方法

s.setblocking()

设置套接字的阻塞或非阻塞模式

s.settimeout()④

设置阻塞套接字操作的超时时间

s.gettimeout()④

获取阻塞套接字操作的超时时间

面向文件的套接字方法

s.fileno()

套接字的文件描述符

s.makefile()

创建与套接字关联的文件对象

数据属性

 

s.family①

套接字家族

s.type①

套接字类型

s.proto①

套接字协议

 

回到顶部

 2.3执行TCP服务器和客户端

服务器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#!/use/bin/env python

 

from socket import *

import time

 

HOST = ''

PORT = 21567

BUFSIZE = 1024

ADDR = (HOST, PORT)

 

tcpSerSock = socket(AF_INET)

tcpSerSock.bind(ADDR)

tcpSerSock.listen(5)

 

while True:

   print 'waiting to connection...'

   tcpCliSock, addr = tcpSerSock.accept()

   print '....connected from:',addr

 

   while True:

      data = tcpCliSock.recv(BUFSIZE)

      if not data:

         break

      lotime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

      tcpCliSock.send('[%s] %s' % (lotime, data))

 

   tcpCliSock.close()

tcpSerSock.close() 

共6页: 上一页123456下一页

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:60%的人不懂Python进程Process,你懂吗?(python的进程和线程)
下一篇:Python爬虫技术:爬虫时如何知道是否代理ip伪装成功?(python爬虫封ip)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~