zoukankan      html  css  js  c++  java
  • 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()





  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/yangruizeng/p/5655792.html
Copyright © 2011-2022 走看看