zoukankan      html  css  js  c++  java
  • 网络编程 并发socketserver

    网络编程 并发socketserver

    • ipv4、ipv6

      • ip协议:规定网络地址的协议
    • B/S架构 C/S架构 bs是cs的一种

      • B/S是浏览器和服务端架构
      • C/S是客户端和服务端架构
    • osi七层协议

      • 机器与机器之间按照约定的协议对信息的解析
    • osi五层协议

      • 应用层 HTTP、ftp、https、smtp协议
      • 传输层 端口、tcp、udp协议 四层交换机,四层路由器
      • 网络层 ipv4 ipv6协议 三层交换机,路由器
      • 数据链路层 mac/arp协议 网卡,以太交换机,网桥
      • 物理层 中继器,集线器,双绞线
    • tcp协议/udp协议

      • tcp协议特点 对可靠要求高的长数据

        • 面向连接 可靠的慢的流式传输

        • 三次握手

          • TCP三次握手的过程如下:
            客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
            服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
            客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
            三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了
            
        • 四次挥手

          • (1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
            (2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
            注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
            (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
            (4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1] 
            既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
            注意:
            (1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2] 
            (2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
            (3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
            无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2]
            
        • 粘包问题

          • 拆包机制:nagel算法

            • 当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发送出去。
              
          • 合包机制

      • udp协议 适用 高并发的短消息

        • 面向数据包的无连接不可靠的快的短数据的传输
        • 不能发生过大的消息
    • arp协议

      • 根据ip地址找mac地址----交换机(广播,单播)
      • 功能:以广播的形式发送数据包,获取目标主机的mac地址
    • 子网掩码,网段,网关ip

    • socket

    • socketserver

      • 实现了并发的tcp协议的socket的server端

      • import socketserver
        class Myservere(socketserver.BaseRequestHandler):
            def handle(self):
                conn = self.request
        server = socketserver.ThreadingTCPServer(("ip地址,duankou"),Myservere)
        server.serve_forever()
        
      • 实例代码

      • server端

        • import socketserver
          class Myserver(socketserver.BaseRequestHandler):
              def handle(self):
                  self.data = self.request.recv(1024).strip()
                  print("{} wrote:".format(self.client_address[0]))
                  print(self.data)
                  self.request.sendall(self.data.upper())
          
          if __name__ == "__main__":
              HOST, PORT = "127.0.0.1", 9999
          
              # 设置allow_reuse_address允许服务器重用地址
              socketserver.TCPServer.allow_reuse_address = True
              # 创建一个server, 将服务地址绑定到127.0.0.1:9999
              server = socketserver.TCPServer((HOST, PORT),Myserver)
              # 让server永远运行下去,除非强制停止程序
              server.serve_forever()
          
      • client端

        • import socket
          
          HOST, PORT = "127.0.0.1", 9999
          data = "hello"
          
          # 创建一个socket链接,SOCK_STREAM代表使用TCP协议
          with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
              sock.connect((HOST, PORT))          # 链接到客户端
              sock.sendall(bytes(data + "
          ", "utf-8")) # 向服务端发送数据
              received = str(sock.recv(1024), "utf-8")# 从服务端接收数据
          
          print("Sent:     {}".format(data))
          print("Received: {}".format(received))
          
  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/yuncong/p/9672082.html
Copyright © 2011-2022 走看看