• python-day29--socket


    一 、客户端/服务器架构

    1.硬件C/S架构(打印机)

    2.软件C/S架构

    二、

    三、

    1.互联网协议就相当于计算机界的英语

    2.数据传输的过程中包头一定要是固定的长度

    四、socket层的位置

    socket层处于应用层于传输层之间--socket抽象层

    五、socket是什么,作用是什么

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

    六、套接字发展史及分类

    基于文件类型的套接字家族

    套接字家族的名字:AF_UNIX

    unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

    基于网络类型的套接字家族

    套接字家族的名字:AF_INET

    七、套接字工作流程

    八、基于TCP的套接字

    基础版

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.bind(('192.168.20.60',8080)) #绑定手机卡
    phone.listen(5) #开机
    
    print('starting...')
    conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
    print(conn,client_addr)
    
    #收,发消息
    data=conn.recv(1024)
    print('client data: <%s>' %data)
    conn.send(data.upper())
    
    conn.close() #挂电话
    phone.close() #关机
    tcp服务端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.connect(('192.168.20.60',8080)) #绑定手机卡
    
    #发,收消息
    phone.send('hello'.encode('utf-8'))
    data=phone.recv(1024)
    print('server back res:<%s>' %data)
    
    phone.close()
    tcp客户端

    加上通信循环

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
    phone.bind(('192.168.20.60',8081)) #绑定手机卡
    phone.listen(5) #开机
    
    print('starting...')
    conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
    print('-------->',conn,client_addr)
    
    #收,发消息
    while True:#通信循环
        data=conn.recv(1024)
        # print('server has recv')
        print('client data: <%s>' %data)
        conn.send(data.upper())
    
    conn.close() #挂电话
    phone.close() #关机
    进阶版--服务端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.connect(('192.168.20.60',8081)) #绑定手机卡
    
    #发,收消息
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
        phone.send(msg.encode('utf-8'))
        print('--->has send')
        data=phone.recv(1024)
        print('server back res:<%s>' %data)
    
    phone.close()
    进阶版--客户端
    #加入一条socket配置,重用ip和端口
    
    phone=socket(AF_INET,SOCK_STREAM)
    phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
    phone.bind(('127.0.0.1',8080))

    加上链接循环

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
    phone.bind(('192.168.20.60',8081)) #绑定手机卡
    phone.listen(5) #开机
    
    print('starting...')
    while True: #链接循环
        conn,client_addr=phone.accept() #等电话 (链接,客户的的ip和端口组成的元组)
        print('-------->',conn,client_addr)
    
        #收,发消息
        while True:#通信循环
            try:
                data=conn.recv(1024)
                if not data:break #针对linux
                print('client data: <%s>' %data)
                conn.send(data.upper())
            except Exception:
                break
        conn.close() #挂电话
    phone.close() #关机
    再次进阶版--服务端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
    phone.connect(('192.168.20.60',8081)) #绑定手机卡
    
    #发,收消息
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
        phone.send(msg.encode('utf-8'))
        print('--->has send')
        data=phone.recv(1024)
        print('server back res:<%s>' %data)
    
    phone.close()
    再次进阶版--客户端(没变)

    九、基于UDP的套接字

    udp是无链接的,先启动哪一端都不会报错

    udp服务端
    1 ss = socket()   #创建一个服务器的套接字
    2 ss.bind()       #绑定服务器套接字
    3 inf_loop:       #服务器无限循环
    4     cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
    5 ss.close()                         # 关闭服务器套接字
    udp服务端
    cs = socket()   # 创建客户套接字
    comm_loop:      # 通讯循环
        cs.sendto()/cs.recvfrom()   # 对话(发送/接收)
    cs.close()                      # 关闭客户套接字
    udp客户端

    udp套接字简单示例

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import socket
    ip_port=('127.0.0.1',9000)
    BUFSIZE=1024
    udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    udp_server_client.bind(ip_port)
    
    while True:
        msg,addr=udp_server_client.recvfrom(BUFSIZE)
        print(msg,addr)
    
        udp_server_client.sendto(msg.upper(),addr)
    udp服务端
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import socket
    ip_port=('127.0.0.1',9000)
    BUFSIZE=1024
    udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
    
        udp_server_client.sendto(msg.encode('utf-8'),ip_port)
    
        back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
        print(back_msg.decode('utf-8'),addr)
    udp客户端

    qq聊天(由于udp无连接,所以可以同时多个客户端去跟服务端通信)

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import socket
    ip_port=('127.0.0.1',8081)
    udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #买手机
    udp_server_sock.bind(ip_port)
    
    while True:
        qq_msg,addr=udp_server_sock.recvfrom(1024)
        print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' %(addr[0],addr[1],qq_msg.decode('utf-8')))
        back_msg=input('回复消息: ').strip()
    
        udp_server_sock.sendto(back_msg.encode('utf-8'),addr)
    udp服务端
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import socket
    BUFSIZE=1024
    udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    qq_name_dic={
        '狗哥alex':('127.0.0.1',8081),
        '瞎驴':('127.0.0.1',8081),
        '一棵树':('127.0.0.1',8081),
        '武大郎':('127.0.0.1',8081),
    }
    
    
    while True:
        qq_name=input('请选择聊天对象: ').strip()
        while True:
            msg=input('请输入消息,回车发送: ').strip()
            if msg == 'quit':break
            if not msg or not qq_name or qq_name not in qq_name_dic:continue
            udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
    
            back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
            print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
    
    udp_client_socket.close()
    udp客户端1
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import socket
    BUFSIZE=1024
    udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    qq_name_dic={
        '狗哥alex':('127.0.0.1',8081),
        '瞎驴':('127.0.0.1',8081),
        '一棵树':('127.0.0.1',8081),
        '武大郎':('127.0.0.1',8081),
    }
    
    
    while True:
        qq_name=input('请选择聊天对象: ').strip()
        while True:
            msg=input('请输入消息,回车发送: ').strip()
            if msg == 'quit':break
            if not msg or not qq_name or qq_name not in qq_name_dic:continue
            udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
    
            back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
            print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))
    
    udp_client_socket.close()
    udp客户端2

    服务端运行结果

    客户端1运行结果

    客户端2运行结果

  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7404969.html
Copyright © 2020-2023  润新知