首页 > 编程语言 > 详细

Python网络编程

时间:2020-08-14 14:23:52      阅读:48      评论:0      收藏:0      [点我收藏+]

1. socket套接字

1.1 socket简介

1)网络中的进程间通信

在本地可以通过进程PID来唯一标识一个进程,但是在网络中这却是行不通的。

TCP/IP协议族已经解决了这个问题,网络层的“IP地址”可以唯一标识网络中的主机,而传输层“协议+端口”可以唯一标识主机中的应用程序(进程)。

这样利用  IP地址,协议,端口  就可以表示网络中的进程了,网络中的进程通信就可以利用这个标志与其他进程进行交互。

2)什么是socket

socket简称套接字,是进程间通信的一种方式;它能实现不同主机间的进程间通信。

socket是应用层与TCP/IP协议族通信中间软件抽象层,它是一组接口

在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口后面,对于用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议;进而,我们无需去关心TCP/UDP协议的细节,因为socket已经封装好了,我们只需要遵循socket的规定去编程,自然就是遵循tcp/udp标准的。

3)socket层

技术分享图片

1.2 套接字的分类

基于文件类型的套接字家族:AF_UNIX

  • 在泛unix系统上,基于文件的套接字调用的就是底层的文件系统来取数据,
  • 两个套接字进程运行在同一机器上,可以通过访问同一个文件来间接完成通信。

基于网络类型的套接字家族:AF_INET

  • 还有AF_INET6被用于ipv6

1.3 套接字的工作流程

1)工作流程图示

技术分享图片

2)工作流程解释

  • 服务器端:服务端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),再调用accept阻塞,等待客户端连接
  • 客户端:服务端初始化完毕后,如果有个客户端初始化一个socket,然后连接服务器(connect),如果简连接成功,这时客户端与服务端的连接就建立了
  • 客户端与服务端进行交互:客户端发送数据请求,服务端接受请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

1.4 创建socket

1)创建socket示例

  • socket_family:可以选择AF_INET或者AF_UNIX
  • socket_type:可以选择SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)
import socket
socket.socket(socket_family,socket_type,protocal=0)
# socket_family 可以是 AF_UNIX 或 AF_INET
# socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM
# protocol 一般不填,默认值为 0

# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 由于 socket 模块中有太多的属性,在这里破例使用了‘from module import *‘语句
# 使用 ‘from socket import *‘, 就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码
# 例如tcpSock = socket(AF_INET, SOCK_STREAM)

2)服务端套接字函数

s.bind()     # 绑定(主机,端口号)到套接字
s.listen()   # 开始TCP监听
s.accept()   # 被动接受TCP客户的连接,(阻塞式)等待连接的到来

3)客户端套接字函数

s.connect()     # 主动初始化TCP服务器连接
s.connect_ex()  # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

4)公共用途的套接字函数

s.recv()            # 接收TCP数据
s.send()            # 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         # 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        # 接收UDP数据
s.sendto()          # 发送UDP数据
s.getpeername()     # 连接到当前套接字的远端的地址
s.getsockname()     # 当前套接字的地址
s.getsockopt()      # 返回指定套接字的参数
s.setsockopt()      # 设置指定套接字的参数
s.close()           # 关闭套接字

5)面向锁的套接字方法

s.setblocking()     # 设置套接字的阻塞与非阻塞模式
s.settimeout()      # 设置阻塞套接字操作的超时时间
s.gettimeout()      # 得到阻塞套接字操作的超时时间

6)面向文件的套接字的函数

s.fileno()          # 套接字的文件描述符
s.makefile()        # 创建一个与该套接字相关的文件

2. 基于TCP的套接字

 

Python网络编程

原文:https://www.cnblogs.com/hgzero/p/13501849.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!