zoukankan      html  css  js  c++  java
  • python--socket套接字/TCP

    socket套接字/TCP

    一 客户端/服务器架构

    C/S架构,包括

    1. 硬件C/S架构(打印机)
    2. 软件C/S 架构(web服务)
    3. C/S架构的软件(软件属于应用层)是基于网络进行通信的

    Server端要:

    1.力求一直提供服务,

    2.要绑定一个唯一的地址,让客户端能够明确的找到

     

    osi七层

    互联网的核心:基于一堆互联网协议组成

    Tcp+ip 找到全世界独一无二的软件

    互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

    每层运行常见物理设备

     

    详细参考:

    http://www.cnblogs.com/linhaifeng/articles/5937962.html#_label4

     

    socket

     

    socket是什么

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。

     

    五 套接字发展史及分类

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

    套接字家族的名字:AF_UNIX

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

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

    套接字家族的名字:AF_INET (地址家族,由于我们只关心网络编程,所以大部门我们只使用AF_INET)

     

     

    六 套接字工作流程

    服务器端:服务器端先初始化Socket,然后进行端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。

    客户端:客户端初始化Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了,客户端发送数据请求,服务器接收请求并处理请求,然后把回应数据发送给客户端,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    Socket()模块函数用法

    import socket
    socket.socket(socket_family,socket_type,protocal=0)
    socket_family(可以是AF_UNIX 或 AF_INET)
    socket_type(可以是 SOCK_STREAM 或 SOCK_DGRAM)
    protocal(一般不填,默认值为0)
    
    #获取tcp/ip套接字
    tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #获取udp/ip套接字
    udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    

      

    服务端套接字函数

    s.bind()  绑定(主机,端口号)到套接字

    s.listen()  开始TCP监听

    s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

     

    客户端套接字函数

    s.connect() 主动舒适化TCP服务器连接

    s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

     

    公共用途的套接字函数

    s.recv()  接收TCP数据

    s.send()  发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)

    s.close()  关闭套接字

     

    socket通信流程与打电话流程类似:

    #服务端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #买手机
    phone.bind(("127.0.0.1",8000))  #绑定手机卡
    phone.listen(5)  #开机
    
    print("starting.....")
    conn,addr=phone.accept()  #等待电话链接
    
    print('电话线路是',conn)
    print("客户端的手机号是",addr)
    while True:#通信循环
        data=conn.recv(1024) #收消息
        print("客户端发来的消息是",data)
        conn.send(data.upper())
    
    conn.close()
    
    phone.close()
    
    执行结果:
    starting.....
    电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 54668)>
    客户端的手机号是 ('127.0.0.1', 54668)
    客户端发来的消息是 b'bith'
    
    
    #客户端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(("127.0.0.1",8000))
    
    while True:#通信循环
        msg=input(">>: ").strip()
        if not msg:continue
        phone.send(msg.encode("utf-8"))
        data=phone.recv(1024)
        print(data)
    
    phone.close()
    
    执行结果:
    >>: bith
    b'BITH'
    

    修改版本

    客户端终止,服务端程序不会中断

    #服务端:
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #买手机
    phone.bind(("127.0.0.1",8000))  #绑定手机卡
    phone.listen(5)  #开机
    print("starting.....")
    while True: #链接循环
        conn,addr=phone.accept()  #等待电话链接
        print('电话线路是',conn)
        print("客户端的手机号是",addr)
        while True:#通信循环
            try: #应对Windows系统
                data=conn.recv(1024) #收消息
                print("客户端发来的消息是",data)
                conn.send(data.upper())
            except Exception:
                break
    
        conn.close()
    
    phone.close()
    
    执行结果
    starting.....
    电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 55009)>
    客户端的手机号是 ('127.0.0.1', 55009)
    客户端发来的消息是 b's'
    电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 55010)>
    客户端的手机号是 ('127.0.0.1', 55010)
    
    
    #客户端
    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(("127.0.0.1",8000))
    
    while True:#通信循环
        msg=input(">>: ").strip()
        if not msg:continue
        phone.send(msg.encode("utf-8"))
        data=phone.recv(1024)
        print(data)
    
    phone.close()
    

      

  • 相关阅读:
    50种方法优化SQL Server
    VS2015在Windows 10 下面安装经验
    python中yield的用法详解——最简单,最清晰的解释
    Mac安装Allure
    Python之pymysql数据库操作
    Python操作Excel神器-openpyxl之写入
    Python OS 模块处理路径
    Python操作Excel神器-openpyxl之读取
    Python中的if __name__ == '__main__'
    Python元组常用方法及汇总
  • 原文地址:https://www.cnblogs.com/niejinmei/p/6803105.html
Copyright © 2011-2022 走看看