zoukankan      html  css  js  c++  java
  • python socket函数详解

    python socket函数详解

    学习了部分有关python socket函数方面的编程操作,但是对于socket函数的了解知之甚少,许多函数在用的时候,都需要在借助网上资料,浪费很多的时间,索性花费一点功夫整理一番,好方便自己以后查阅。

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

    一、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)

    二、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() 返回套接字的文件描述。

    三、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()
    

    四、socket编程代码

    实现客户端向服务端发送消息,代码比较简单,功能单一。

    socket编程之服务端代码

    #socket服务端
    import socket
    
    server = socket.socket()
    #绑定到0.0.0.0:8000端口上
    server.bind(("0.0.0.0",8000))#0.0.0.0    同局域网下的其它机器可以通过本机ip来访问服务器
    server.listen()
    
    #阻塞等待连接
    sock,addr = server.accept()
    data=""
    while True:
        temp_data = sock.recv(1024)
        if temp_data:
            data += temp_data.decode("utf8")
        else:
            break
    
    print(data)
    server.close()
    

    socket编程之客户端代码

    #socket客户端
    import socket
    
    client = socket.socket()
    client.connect(("192.168.10.132",8000))#本机IP连接
    
    client.send("666".encode("utf8"))
    client.close()
    

    执行效果

    启动服务端,启动客户端,最终效果。

    服务端执行效果:

    客户端执行效果:

  • 相关阅读:
    [ jquery 选择器 :nth-last-child ] 选取属于其父元素的不限类型的第 n 个子元素的所有元素,从最后一个子元素开始计数
    [ jquery 选择器 :nth-child ] 选取匹配其父元素下的第N个子或奇偶元素
    [ jquery 选择器 :first :first-child ] 实例分析: :first :first-child 之间在元素选取方面的区别
    [ jquery 位置选择器 :first-child :last-child ] 强化说明:选取属于其父元素和所有兄弟元素中子元素集合中处于第一个(最后一个)位置上符合条件的元素
    [ jquery 位置选择器 :first :last ] 强化说明:获取匹配的第一个(最后第一个)元素
    [ jquery 过滤器 is(expr | jqObj | ele | function) ] 此方法用于在选择器的基础之上根据选择器 DOM元素或 jQuery 对象来检测匹配元素集合
    PAT 甲级 1009 Product of Polynomials
    PAT 甲级 1003 Emergency DFS
    PAT 甲级 1002 A+B for Polynomials
    PAT 甲级 1001 A+B Format
  • 原文地址:https://www.cnblogs.com/Monste/p/13381952.html
Copyright © 2011-2022 走看看