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_INETsocket.AF_INET6,还有其他依赖于操作系统的协议族,可以通过上面的代码查看。

SocketKind

import socket

for sk in iter(i for i in dir(socket) if i.startswith(‘SOCK_‘)):
    print(sk)

socket类型通用的有socket.SOCK_STREAMsocket.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模块的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段

Python中的socket模块

如何将字符串数据从活动发送到片段?

Python socket网络模块

在 KrakenJS/Express 中加载 socket.io 作为模块