zoukankan      html  css  js  c++  java
  • c/s架构搭建

    1.socket(套接字)

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

    2.套接字有两种,分别是基于文件型的和基于网络型的。 

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

    3.套接字的工作流程

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

    4.基于TCP的套接字

    服务端

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

    客户端

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

    下面模仿手机通讯来说明下套接字的流程

    服务端

    import socket
    
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM
    # print(phone)
    
    #2、插入/绑定手机卡
    # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8080)) # 绑定的里面放的是元组!元组!元组!!!
    
    #3、开机
    phone.listen(5) # 半连接池,限制的是请求数
    
    #4、等待电话连接
    print('start....')
    while True: # 连接循环
        conn,client_addr=phone.accept() #(三次握手建立的双向连接,(客户端的ip,端口))
        # print(conn)
        print('已经有一个连接建立成功',client_addr)
    
        #5、通信:收发消息
        while True: # 通信循环
            try:
                print('服务端正在收数据...')
                data=conn.recv(1024) #最大接收的字节数,没有数据会在原地一直等待收,即发送者发送的数据量必须>0bytes
                # print('===>')
                if len(data) == 0:break #在客户端单方面断开连接,服务端才会出现收空数据的情况
                print('来自客户端的数据',data)
                conn.send(data.upper())
            except ConnectionResetError:
                break
        #6、挂掉电话连接
        conn.close()
    
    #7、关机
    phone.close()
    

    客户端

    import socket
    
    #1、买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # print(phone)
    #2、拨电话
    phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口
    
    #3、通信:发收消息
    while True: # 通信循环
        msg=input('>>: ').strip() #msg=''
        if len(msg) == 0:continue
        phone.send(msg.encode('utf-8'))
        # print('has send----->')
        data=phone.recv(1024)
        # print('has recv----->')
        print(data)
    
    #4、关闭
    phone.close()
    

      

  • 相关阅读:
    软工5--结对2--四则运算生成器
    软工4——结对审查
    天数计算器
    翻转字符串
    位图排序
    软工 assignment 3 —— 求最大子数列之和
    剑指offer 面试题5.替换空格
    剑指offer 面试题4.二维数组中的查找
    剑指offer 面试题3.数组中重复的数字
    如何通过onenote发送博客到cnblog(博客园)
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9275643.html
Copyright © 2011-2022 走看看