• 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运行结果

  • 相关阅读:
    生成验证码图片(含模糊背景)
    再论验证码安全:请及时销毁你的验证码
    C# DES 加密/解密
    jQuery 表格工具集
    见证VS2010发布会[转]
    jQuery Lightbox(balupton版)图片展示插件讲解
    Coding完美世界——VS2010发布会见闻!【转】
    asp.net对Get请求的加密
    【C#源码】DES加密解密类
    asp.net1.1和asp.net 2.0共存
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7404969.html
Copyright © 2020-2023  润新知