Python 爬虫 (三) - Socket 网络编程

栏目: 编程语言 · Python · 发布时间: 6年前

内容简介:写这篇博文, 也希望回顾并整理一下以前学过的c语言和linux下一些东西, 会将一些Linux网络编程的函数和Python网络变成函数做一个简单的对照, 方便记忆。

python的网络变成比 c语言 简单许多, 封装许多底层的实现细节, 方便 程序员 使用的同时, 也使程序员比较难了解一些底层的东西, 我觉得学网络编程还是用c语言更好一点.

写这篇博文, 也希望回顾并整理一下以前学过的c语言和 linux 下一些东西, 会将一些Linux网络编程的函数和 Python 网络变成函数做一个简单的对照, 方便记忆

1. Socket套接字的概念


Socket(翻译为套接字, 我觉得很挫),是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。它是网络进程的ID。网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信, 又称进程间通信, IP协议进行的主要是端到端通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。

所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程.

端口号的范围从0~65535,一类是由互联网指派名字和号码公司ICANN负责分配给一些常用的应用程序固定使用的“周知的端口”,其值一般为0~1023, 用户自定义端口号一般大于等于1024, 我比较喜欢用8888

每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的

1.1. Socket类型

socket类型在Liunx和Python是一样的, 只是Python中的类型都定义在socket模块中, 调用方式socket.SOCK_XXXX

  • 流式socket(SOCK_STREAM) 用于TCP通信

流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性

  • 数据报socket(SOCK_DGRAM) 用于UDP通信

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP

  • 原始socket(SOCK_RAW) 用于新的网络协议实现的测试等

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以, 其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

2. Socket编程


2.1. TCP通信

TCP通信的基本步骤如下:
服务端:socket—bind—listen—while(True){—accept—recv—send—-}—close
客户端:socket———————————-connect—send—recv——-close

Python 爬虫 (三) - Socket 网络编程

TCP

socket函数
使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字

2.1.1. 服务器端函数

bind函数
将套接字绑定到地址, python下,以元组(host,port)的形式表示地址, Linux下使用sockaddr_in结构体指针

listen函数
使服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求。如果客户端有连接请求,端口就会接受这个连接

accept函数
接受远程计算机的连接请求,建立起与客户机之间的通信连接。服务器处于监听状态时,如果某时刻获得客户机的连接请求,此时并不是立即处理这个请求,而是将这个请求放在等待队列中,当系统空闲时再处理客户机的连接请求。

2.1.2. 客户端函数

connect函数
用来请求连接远程服务器

2.1.3. 通用函数

接收远端主机传来的数据

recv函数

send函数
发送数据给指定的远端主机

close函数
关闭套接字

2.2. 简单的客户端服务器TCP连接

一个简单的回显服务器和客户端模型, 客户端发出的数据, 服务器会回显到客户端的终端上(只是一个简单的模型, 没考虑错误处理等问题)

2.2.1. 带错误处理的客户端服务器TCP连接

在进行网络编程时, 最好使用大量的错误处理, 能够尽量的发现错误, 也能够使代码显得更加严谨

2.3. UDP通信

UDP通信流程图如下:
服务端:socket—bind—recvfrom—sendto—close
客户端:socket———-sendto—recvfrom—close

Python 爬虫 (三) - Socket 网络编程
UDP

sendto()函数
发送UDP数据, 将数据发送到套接字

recvfrom()函数
接受UDP套接字的数据, 与recv()类似

2.4. 简单的客户端服务器UDP连接

2.5. 其他

3. 参考链接


python-socket官方文档


以上所述就是小编给大家介绍的《Python 爬虫 (三) - Socket 网络编程》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

支付战争

支付战争

埃里克•杰克逊 / 徐彬、王晓、清华大学五道口金融学院未央研究 审译 / 中信出版社 / 2015-5-19 / 49.00

这是一个野心勃勃的创业计划,在线支付鼻祖PayPal试图创造一个“统治世界”的金融操作系统,并在全球成功推广一款颠覆式的互联网产品。 《支付战争》的作者是“PayPal黑帮”成员之一,他真实还原了这个伟大产品是如何诞生的,以及在后来的发展壮大之路上,如何应对融资紧张、突破增长瓶颈,在竞争者凶猛围剿与平台商霸王条款的夹击下,逆境求生,改变业务模式,最终完成IPO,并成功出售给竞争对手eBay的......一起来看看 《支付战争》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具