• Python socket网络编程


    1 服务器 客户端架构 C/S架构

    server端要求:

    1.力求一直提供服务
    2. 绑定一个地址,客户能够一直找到
    

    2 OSI七层

    数据链路层是 以太网协议
    IP是通过子网查找 ARP协议 Mac地址
    TCP/UDP 是传输层 找对应的端口
    

    3 SOCKET层

    socket是把TCP/IP协议隐藏在Scocket后面

    4 socket工作流程

    先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

    打电话模拟socket通信

    服务端

    import socket
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 买手机
    # 解决这个错误 [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
    phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    phone.bind(('127.0.0.1', 8888))  # 手机卡                 # j加上以后就不用重新
    phone.listen(5)  # 手机待机 5相当于挂起的电话连接
    
    print('server is starting...')
    while True:
        #     conn,addr = phone.accept()  # accept()返回的是一个元组,
        conn, addr = phone.accept()  # 等待接听电话
        # print(phone.accept())
        print("电话线路" , conn)
        print("手机的地址" , addr)  # 手机号
        while True:
            try:# 应对Windows系统
                data = conn.recv(1024)  # 从自己的缓存中寻找数据
                if not data:
                    continue  # 应对Linux系统
                print("客户发来消息%s" % data)
                conn.send(data)
            except Exception as e:
                break
        conn.close() #挂电话
    phone.close()# 关闭手机
    
    '''
    server is starting...
    电话线路 <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8888), raddr=('127.0.0.1', 1676)>
    手机的地址 ('127.0.0.1', 1676)
    客户发来消息b'hello'
    客户发来消息b'world'
    '''
    

    客户端

    import socket
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    phone.connect(('127.0.0.1', 8888))  # 直接连接
    
    while True:
        msg = input(">>>:").strip()
        if not msg:
            continue  # 输入为空的时候 等待
        phone.send(msg.encode('utf-8'))  # 发送的是bytes数据
        data = phone.recv(1024)
        print(data)
    phone.close()
    '''
    >>>:hello
    b'hello'
    >>>:world
    b'world'
    >>>:
    '''
    

    网络通信参考http://www.cnblogs.com/linhaifeng/articles/5937962.html

  • 相关阅读:
    助理需要看的书
    linux 磁盘管理以及维护
    转:工作与创业区别
    《编写可读代码的艺术》---把控制流变得可读
    Visual studio插件 Reshaper--- 常用快捷键
    为啥我喜欢在Windows 7环境下做Unity开发?
    《编写可读代码的艺术》---写出言简意赅的注释
    《编写可读代码的艺术》---该写什么样的注释
    《编写可读代码的艺术》---美观代码
    《编写可读代码的艺术》---不会误解的名字
  • 原文地址:https://www.cnblogs.com/Python666/p/6804401.html
Copyright © 2020-2023  润新知