socket模块
Posted ikct2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket模块相关的知识,希望对你有一定的参考价值。
socket模块
简介
socket即套接字,是用来建立网络通信连接的基础,大量的应用程序都是通过套接字来实现网络通信,诸如HTTP浏览器、RPC通信、FTP下载等。
使用
常见的TCP连接使用socket的通信原语,如bind/listen/accept/connect/recv/sendall等,这里我不会介绍以上通用的原语,我们讲讲一些其他的配置。
建立socket使用socket.socket(socket.AF_INET, socket.SOCK_STREAM)
。
其中第一个参数为协议族,约定了socket的地址类型;第二个参数为socket类型,指定了面向协议的类型;其实还有第三个隐藏的参数,用来指定协议类型,但通常为0,这使得第二个参数可以自动选择对应socket的内置协议。
AddressFamily
import socket
for af in iter(i for i in dir(socket) if i.startswith(‘AF_‘)):
print(af)
协议族有socket.AF_INET
,socket.AF_INET6
,还有其他依赖于操作系统的协议族,可以通过上面的代码查看。
SocketKind
import socket
for sk in iter(i for i in dir(socket) if i.startswith(‘SOCK_‘)):
print(sk)
socket类型通用的有socket.SOCK_STREAM
,socket.SOCK_DGRAM
,前者用于TCP连接,后者用于UDP连接,还有其它的依赖于操作系统的socket类型,通过上面代码查看。
配置
socket.setsockopt(level, optname, value)
,相关level和optname可以在查看<socket.h>文件或这里
level有一个常用的常量,SOL_SOCKET
,是套接字级别的设置,而非协议层级别。
选择该level后可选设置有很多,用如下代码看下有哪些常量。
import socket
for consts in iter(i for i in dir(socket) if i.startswith(‘SO_‘))):
print(consts)
SO_REUSEADDR
其值类型为布尔型整数(0或1),表示当socket断开连接后是否立即释放端口,默认为0,所以有时重启个人服务器会出现socket端口占用的异常,这是因为系统会自动保留一段时间socket端口。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((ip or domain, port))
SO_KEEPALIVE
值类型布尔型整数,用于心跳检测(TCP协议栈四层),但只能检测连接是否存活,不能检测是否可用,并且网络故障导致的信息重传优先级比检测包高,会出现延时。
结论就是不好用,不如应用层的心跳检测。
以上是关于socket模块的主要内容,如果未能解决你的问题,请参考以下文章
CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段