从编程角度看TCP协议(2)python如何操作tcp

1. socket【套接字】

    大家都知道,任何一门语言要读写文件,都会调用操作系统提供的文件API,比如open、read、write、close等等。那如果要通过网卡去收发数据呢?这时候就需要操作系统提供的socket了。

    python可以通过在文件头部执行以下语句,调用操作系统提供的socket API(python标准socket库)。

import socket

    上面的socket是一个module,对应了一个.py文件,里面提供了一些常量、类和方法,比如:

socket.socket:            代表socket类
socket.AF_INET:           代表一个常量,表示IPv4协议
socket.AF_INET6:          代表一个常量,表示IPv6协议
socket.SOCKET_STTEAM:     代表一个常量,表示TCP协议
socket.SOCKET_DGRAM:      代表一个常量,表示UDP协议
socket.SOCKET_RAW:        代表一个常量,表示直接在网络层传输数据,而不是通过TCP/UDP

 

2. tcp socket

    我们可以通过实例化类socket.socket来创建一个socket【套接字】,不过我们需要给定输入参数,告知python解释器,你创建的socket是TCP的socket还是UDP的socket,亦或者原始socket(即直接在网络层收发数据的socket)。执行以下命令创建一个tcp socket。

import socket


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

 

3 修改socket参数的常用方法

    上文我们创建了一个tcp的socket,有时候我们需要对创建的socket,进行参数的设置,这时候我们就会调用一些方法,来达成我们的目的,如下表所示,当然了,这些方法不仅仅针对tcp的socket,也包括udp其他的socket。

socket参数修改方法作用输入参数返回参数备注
sk.setblocking(True)设置socket为阻塞模式True:表示阻塞;False:表示非阻塞  
sk.settimeout(time)设置超时数据设置的秒数  
sk.setsockopt(level, optname, value)设置socket参数,比如发送、接收缓冲区大小参数的级别,名称以及值  
sk.gettimeout()获取超时时间 超时的秒数 
sk.getsockopt(level, optname)获取socket参数值参数的级别和名称参数的值 
sk.getsockname()获取本地socket 本地socket,元组形式 
sk.getpeername()获取远端socket 远端socket,元组形式不是任意一个socket都可以,不支持的socket会抛出异常

 

4. tcp socket的常用方法    

    创建完socket实例后,我们就可以使用响应的实例方法,来创建连接、收发数据以及关闭连接,当然还可以更改socket的参数。针对tcp的socket,常用的实例方法有:

tcp socket常用的方法适用于作用输入参数返回值异常
tcp_sk.bind((host, port))服务器服务器向操作系统申请一个端口

服务器的ip/域名和端口组成的一个元组,

例如(host, port),不是两个变量host, port。

 

None:表示申请地址和端口成功地址或者端口被占用,抛出异常
tcp_sk.listen(backlog)服务器服务器侦听已经申请的端口最多接收的客户端连接数  
tcp_sk.accept()服务器服务器接收客户端连接有两个,一个是客户端的socket,另一个是客户端地址和端口组成的元组 
tcp_sk.connect((host, port))客户端客户端主动向服务器发起建立连接要连接服务器的ip/域名和端口组成的元组,同上bind方法None:表示连接建立成功服务器拒绝此连接,或者不响应此连接,抛出异常

tcp_sk.shutdown

(socket.SHUT_RDWR)

客户端/服务器均可关闭已经建立的连接

关闭连接的方向,例如socket.SHUT_RDWR:读写方向;socket.SHUT_RD:读方向;socket.SHUT_WR:写方向

None:表示关闭连接成功 
tcp_sk.recv(bufsize)客户端/服务器均可从连接上接收数据python程序缓冲区大小,即程序允许期间分配的内存的大小一次接收到的数据,大小不超过bufsize,该数据是字节串,需要解码后才能使用 
tcp_sk.sendall(data)客户端/服务器均可向连接上发送数据要发送的数据,该数据必须是bytes类型,否则要先编码成字节串,再发送None:表示发送数据成功 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值