美文网首页
Python socket详解,全网最全教程

Python socket详解,全网最全教程

作者: 颜狗一只 | 来源:发表于2023-08-07 16:28 被阅读0次

    Socket编程

    1.基本概念

    1.什么是客户端/服务器架构?
    

    服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。

    它存在唯一目的就是等待客户端的请求,
    并响应它们(提供服务),然后等待更多请求。

    说白了就是一个提供服务,一个请求服务得到相应的一个过程。

    2.套接字:通信端点
    

    套接字是计算机网络数据结构,它体现了上节中描述的“通信端点”的概念。

    在任何类型的通信开始之前,网络应用程序必须创建套接字。

    可以将它们比作电话插孔,没有它将无法进行通信。

    Python只支持AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET ,重点使用基于网络的AF_INET.

    3.套接字地址:主机-端口对
    

    它是网络通信过程中端点的抽象表示,python使用元组保存:ADDR = (HOST,PORT)。

    4.套接字类型
    

    流式套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。

    数据报套接字(SOCK_DGRAM):提供了一种无连接的服务。

    该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。

    2.Python网络编程

    2.1 常见的套接字对象方法和属性

    2.2 创建服务和客户端

    2.2.1 创建TCP服务

    一般的创建流程:

    ss = socket()       #  创建服务器套接字
    ss.bind(ADDR)       #  套接字与地址绑定
    ss.listen()         #  监听连接
    while True:         #  服务器无限循环
    cs = ss.accept()    #  接受客户端连接
    comm_loop:          #  通信循环
    cs.recv()/cs.send() #  对话(接收 / 发送)
    cs.close()          #  关闭客户端套接字
    ss.close()          #  关闭服务器套接字 # (可选)
    

    2.2.2 创建 TCP 客户端

    一般的创建流程:

    cs = socket()       #  创建客户端套接字
    cs.connect()        #  尝试连接服务器
    comm_loop:          #  通信循环
    cs.send()/cs.recv() #  对话(发送 / 接收)
    cs.close()          #  关闭客户端套接字
    

    2.2.3 创建UDP服务

    一般的创建流程:

    ss = socket()       #  创建服务器套接字
    ss.bind(ADDR)       #  套接字与地址绑定
    while True:         #  服务器无限循环
    ss.sendto()         #  发送 
    ss.recvfrom()       #  接收
    ss.close()          #  关闭服务器套接字 # (可选)
    

    2.2.4 创建 UDP 客户端

    一般的创建流程:

    cs = socket()       #  创建客户端套接字
    comm_loop:          #  通信循环
    cs.sendto()         #  发送 
    cs.recvfrom()       #  接收
    cs.close()          #  关闭客户端套接字
    

    server.py代码

    import socket
    from time import ctime
    import json
    import time
    HOST = ''
    PORT = 9001
    ADDR = (HOST, PORT)
    BUFFSIZE = 1024
    MAX_LISTEN = 5
    
    
    def tcpServer():
        # TCP服务
        # with socket.socket() as s:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            # 绑定服务器地址和端口
            s.bind(ADDR)
            # 启动服务监听
            s.listen(MAX_LISTEN)
            print('等待用户接入。。。。。。。。。。。。')
            while True:
                # 等待客户端连接请求,获取connSock
                conn, addr = s.accept()
                print('警告,远端客户:{} 接入系统!!!'.format(addr))
                with conn:
                    while True:
                        print('接收请求信息。。。。。')
                        # 接收请求信息
                        data = conn.recv(BUFFSIZE)
                        print('data=%s' % data)
                        print('接收数据:{!r}'.format(data.decode('utf-8')))
    
                        # 发送请求数据
                        conn.send(data.encode('utf-8'))
                        print('发送返回完毕!!!')
                s.close()
    
    
    # 创建UDP服务
    def udpServer():
        # 创建UPD服务端套接字
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            # 绑定地址和端口
            s.bind(ADDR)
            # 等待接收信息
            while True:
                print('UDP服务启动,准备接收数据。。。')
                # 接收数据和客户端请求地址
                data, address = s.recvfrom(BUFFSIZE)
    
                if not data:
                    break
    
                print('接收请求信息:{}'.format(data.decode('utf-8')))
    
                s.sendto(b'i am udp,i got it', address)
    
            s.close()
    
    if __name__ == '__main__':
    
        while True:
            choice = input('input choice t-tcp or u-udp:')
    
            if choice != 't' and choice != 'u':
                print('please input t or u,ok?')
                continue
    
            if choice == 't':
                print('execute tcpsever')
                tcpServer()
            else:
                print('execute udpsever')
                udpServer()
    

    client.py代码

    import socket
    
    from time import ctime
    HOST = 'localhost'
    PORT = 9001
    ADDR = (HOST, PORT)
    ENCODING = 'utf-8'
    BUFFSIZE = 1024
    
    
    def tcpClient():
        # 创建客户套接字
        with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s:
            # 尝试连接服务器
            s.connect(ADDR)
            print('连接服务成功!!')
            # 通信循环
            while True:
                inData = input('pleace input something:')
                if inData == 'q':
                    break
                # 发送数据到服务器
                inData = '[{}]:{}'.format(ctime(), inData)
    
                s.send(inData.encode(ENCODING))
                print('发送成功!')
    
                # 接收返回数据
                outData = s.recv(BUFFSIZE)
                print('返回数据信息:{!r}'.format(outData))
    
            # 关闭客户端套接字
            s.close()
    
    
    def udpClient():
        # 创建客户端套接字
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            while True:
                # 发送信息到服务器
                data = input('please input message to server or input \'quit\':')
                if data == 'quit':
                    break
                data = '[{}]:{}'.format(ctime(), data)
    
                s.sendto(data.encode('utf-8'), ADDR)
    
                print('send success')
    
                # 接收服务端返回信息
                recvData, addrs = s.recvfrom(BUFFSIZE)
    
                print('recv message : {}'.format(recvData.decode('utf-8')))
    
            # 关闭套接字
            s.close()
    
    
    if __name__ == '__main__':
    
        while True:
            choice = input('input choice t-tcp or u-udp or q-quit:')
            if choice == 'q':
                break
            if choice != 't' and choice != 'u':
                print('please input t or u,ok?')
                continue
    
            if choice == 't':
                print('execute tcpsever')
                tcpClient()
            else:
                print('execute udpsever')
                udpClient()
    

    代码说明:先执行 python server.py,在执行python client.py,就可以测试TPC/UDP简单的通信了。

    相关文章

      网友评论

          本文标题:Python socket详解,全网最全教程

          本文链接:https://www.haomeiwen.com/subject/sdpgpdtx.html