• python网络编程-socket


    python提供了两个socket模块

    Socket,它提供了标准的BSD Sockets API

    SocketServer,它提供了服务器中心类,可以简化网络服务器的开发

    下面先说socket模块

    1、socket类型

    套接字格式:

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

    常用的套接字类型:

    socket.SOCK_STREAM      面向连接的,TCP

    socket.SOCK_DGRAM无连接,UDP

    创建TCP Socket:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    创建UDP Socket:s=socket.socket(socket.AF_INET,socket.DGRAM)

    2、socket函数

    注意点:

    1)TCP返送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。

    2)python2.x版本发送的是字符串格式的数据,python3.x是字节格式,需注意。

    s.bind(address)                将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址

    s.listen(backlog)              开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值最少为1,大部分应用程序设定为5就可以了。

    s.accept()                        接收TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

    s.connect(address)         连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket error错误。

    s.connect_ex(address)   功能与connect(address)相同,但是成功返回0,失败返回error的值。

    s.recv(bufsize[,flag])       接收TCP套接字的数据。数据以bytes字节形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。

    s.send(string[,flag])        发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

    s.sendall(string[,flag])    完整发送TCP数据。将string中的数据发送到连接的套接字。但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    s.close()  关                   闭套接字。

    3、socket编程思路

    TCP服务端:

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

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

       s.bind()

    2 开始监听连接 

       s.listen()

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

    s.accept()

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

    s.recv()

    s.sendall()

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

    s.close()

    TCP客户端:

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

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

    s.connect()

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

    s.sendall()

    s.recv()

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

    s.close()

    4、简单的socket编程代码

    ​SERVER端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
      
    import socket                #导入socket模块
      
    ip_port=('127.0.0.1',9999)   #定义主机,端口号
      
    s=socket.socket()            #实例化socket对象(买手机)
      
    s.bind(ip_port)              #绑定IP端口(买手机卡)
      
    s.listen(5)                  #建立5个连接池,等待接收请求,挂起连接
      
    #等待电话
    conn,addr=s.accept()         #conn就是建立通信,负责收发消息的通道,每次只处理一个请求,
                                 #accept是阻塞请求,当第二个请求来的时候会进入listen连接池
                                 #挂起等待处理
    while True:
        try:
            recv_data = conn.recv(1024)             #收消息
            if len(recv_data) == 0:break            #如果客户输入为空的话退出
            if recv_data == 'exit':break            #客户端退出,服务端跟着退出
            send_data = recv_data.upper()          
      
            print(send_data)
            conn.send(send_data)                    #回复消息
        except Exception:
            break
      
    conn.close()                                    #挂电话,关闭连接通道

    Client端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
      
    import socket
      
    ip_port=('127.0.0.1',9999)
      
    s=socket.socket()
      
    s.connect(ip_port)    #这里的connect实际是服务端的conn,与服务端建立连接
      
      
    while True:
        send_data=input(">>>: ").strip() #发送消息
        if send_data == 'exit':break
        if len(send_data) == 0:continue
        s.send(bytes(send_data,encoding='utf-8'))
      
        #收消息
        recv_data=s.recv(1024)
        print(str(recv_data,encoding='utf-8'))
      
    #挂电话
    s.close()





  • 相关阅读:
    word文字或者图片显示不全
    Windows部署禅道
    IEEE怎么读
    HiSLIP
    瀑布式开发与敏捷开发的区别
    C++ STL :unordered_multimap
    Microsoft Defender SmartScreen 阻止了无法识别的应用启动
    Qt比较浮点数
    常用的adb命令
    用wiremock自建mock服务
  • 原文地址:https://www.cnblogs.com/yangruizeng/p/5655792.html
Copyright © 2020-2023  润新知