关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确。每次都查半天,经常烦恼于此。索性都弄得清楚、通透,并记录下来,一来便于自己记忆,再者以防日后查阅、回顾。

主要介绍:socket、bind、listen、connect、accept、send、sendto、recv、recvfrom、close、shutdown。

1.socket类型

套接字格式

socket(family,type[,protocal])使用给定的地址族,套接字类型,协议编号(默认为0)来创建套接字

其中:

family指明了协议族/域,通常AF_INET、AF_INET6、AF_LOCAL等;

type是套接口类型,主要是SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;

protocol一般取为0。(默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议成功时,返回一个小的非负整数值,与文件描述符类似。

创建TCP Socket:

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

创建UDP Socket:

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.socket函数

注意:

  • TCP发送数据时,已经建立好TCP连接,所以不需要指定的地址,而UDP是面向无连接的,每次发送要指定发送给谁。
  • 服务端与客户端不能直接发送列表,元组,字典。需要进行字符串化。

host == ip

服务端socket函数

函数 描述
s.bind(address) 将套接字绑定到地址,在AF_INET下,以tuple(host,prot)的方式传入,如s.bind((host,port))。
s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值最少为1,大部分应用程序社为5就可以了。
s.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据,address是连接客户端的地址。(sock,addr = s.accept)。

客户端socket函数

函数 描述
s.connect(address) 链接到address处的套接字,一般address的格式为tuple(host,port),如果链接出错,则返回socket.error错误。
s.connect_ex(address) 功能与s.connect(address)相同,但成功返回0,失败返回errno的值。

公共Socket函数

函数 描述
s.recv(bufsize[,flag]) 接受TCP套接字的数据,数据以字符串的形式返回,bufsize指定要接收的最大数据量,flag提供有关消息的其它消息,通常可以忽略。
s.recvfrom(bufsize[,flag]) 接受UDP套接字的数据,与recv()类似,但返回值是tuple(data,address)。其中data是包涵接受数据的字符串,address是发送数据的套接字地址。
s.send(string[,flag]) 发送TCP数据,将string中的数据发送到连接到套接字,返回值是要发送到字节数量,该数量可能小于string的字节大小。
s.sendall(string[,flag]) 完整发送TCP数据,将string中的数据发送到链接到套接字,但在返回之前尝试发送所有的数据。成功返回None,失败则抛出异常。
s.sendto(string[,flag],address) 发送UDP数据,将数据发送到套接字,address形式为tuple(hostadder,port),指定远程地址发送,返回值是发送到字节。
s.close() 关闭套接字。
s.getpeername() 返回套接字的远程地址,返回值通常是一个tuple(hostaddr,port)。
s.getsockname() 返回套接字自己的地址,返回值通常是一个tuple(hostaddr,port)。
s.getsockopt(level,optname[,buflen]]) 返回套接字选项的值。
s.gettimeout() 返回当前超时值,单位是秒,如果没有设置超时值则返回None。
s.setsockopt(level, option,value) 设置给定套接字选项的值
s.settimeout(timeout) 设置套接字操作的超时时间,timeout是一个浮点数,单位是秒。值为None则表示永远不会超时。一般超时期应在刚创建套接字时设置,因为它们可能用于连接的操作,如s.connect()。
s.setblocking(flag) 如果flag为0,则将套接字设置为非阻塞模式,否则将套接字设置为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引发socket.error异常。
s.makefile() 创建一个与该套接字相关的文件。
s.fileno() 返回套接字的文件描述。

3.socket编程思路

TCP服务端:

1创建套接字,绑定套接字到本地IP与端口

socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",80000))

2开始监听连接

s.listen()

3进入循环,不断接受客户端的连接请求

s.accept()

4然后接受传来的数据,并发送给对方数据

s.recv()					#接收数据
s.sendall() #发送数据

5传输完毕后,关闭套接字

s.close()

TCP客户端

1创建套接字,连接远端地址

socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",8000))

2连接后发送数据和接受数据

s.sendall()
s.recv()

3传输完毕后,关闭套接字

s.close()

python socket函数详解的更多相关文章

  1. windows socket函数详解

    windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...

  2. c/c++ socket函数详解

    c/c++ socket函数详解 注意: 使用socketAPI前,要先将相关链接库(Ws2_32.lib)加入链接,并使用WSAStartUp函数初始化.每个socket函数都可能失败(返回-1), ...

  3. 常用socket函数详解

    常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...

  4. python --- socket模块详解

    socket常用功能函数: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)                  ...

  5. Socket函数详解

    #include <sys/types.h>; #include <sys/socket.h>; --------------------------------------- ...

  6. php socket函数详解

    最近在用socket实现服务端向客户端主动推送消息 函数名 描述 socket_accept() 接受一个Socket连接 socket_bind() 把socket绑定在一个IP地址和端口上 soc ...

  7. python super()函数详解

    引言: 在类的多继承使用场景中,重写父类的方法时,可能会考虑到需要重新调用父类的方法,所以super()函数就是比较使用也很必要的解决方法: 文章来源: http://www.cnblogs.com/ ...

  8. Python匿名函数详解

    python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的. 在Python中,lambda ...

  9. 04 python之函数详解

    一.函数初识 函数的产生:函数就是封装一个功能的代码片段. li = ['spring', 'summer', 'autumn', 'winter'] def function(): count = ...

随机推荐

  1. 入门大数据---Flume整合Kafka

    一.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合 ...

  2. Mariadb之事务隔离级别

    上一篇我们聊到了mariadb的锁,以及怎么手动加锁和解锁等等,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13196905.html:今天我们来聊一聊mar ...

  3. 学习Java的Day03

    接口的特点!!!! 接口不能创建对象 接口的变量使用public static final修饰,如果不写默认添加: 接口的方法为public abstrict,如果不写默认添加: 子类必须重写接口中所 ...

  4. ajax前后端交互原理(4)

    4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...

  5. max depth exceeded when dereferencing c0-param0的问题

    在做项目的时候,用到了dwr,有一次居然报错,错误是max depth exceeded when dereferencing c0-param0 上网查了一下,我居然传参数的时候传的是object类 ...

  6. 硬刚 lodash 源码之路,_.chunk

    前置 chunk 函数内部借助其他函数实现,所以从其他函数开始,chunk 在最后. 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节. isObject 判断是否为 Obje ...

  7. 机器学习入门:极度舒适的GBDT原理拆解

    机器学习入门:极度舒适的GBDT拆解 本文旨用小例子+可视化的方式拆解GBDT原理中的每个步骤,使大家可以彻底理解GBDT Boosting→Gradient Boosting Boosting是集成 ...

  8. 这些 CSS 命名规范将省下你大把调试时间

    我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...

  9. 02 . SaltStack高级用法(Python API)

    Python API简单使用 第一条命令 /usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用 >>> import salt. ...

  10. 一小时完成后台开发:DjangoRestFramework开发实践

    DjangoRestFramework开发实践 在这之前我写过一篇关于Django与Drf快速开发实践的博客,Django快速开发实践:Drf框架和xadmin配置指北,粗略说了一下Drf配置和基本使 ...