21 python

IP唯一标示网络中一台设备

Port 唯一标示设备中的一个程序

通信协议使计算机能够互相理解

每个IP地址包括两部分:网络地址和主机地址

Socket(套接字)本质是编程接口 对TCP/IP的封装

    套接字之间连接分三步:服务器监听 客户端请求 连接确认

UDP 用户数据报协议 是无连接的 提供不可靠的通讯 没有超时重发 传输速度快

TCP 在收发数据前 必须和对方建立可靠的连接 需要三次握手

    三次握手    A -1请求连接-> B -2确认->A-3同步->B

UDP数据收发

  1 from socket import *
  2 
  3 udpSocket = socket(AF_INET,SOCK_DGRAM)
  4 bindAddr  = ("", 7788)
  5 udpSocket.bind(bindAddr)
  6 while True:
  7     recvData = udpSocket.recvfrom(1024)
  8     udpSocket.sendto(recvData[0], recvData[1])
  9     print(recvData)

Tcp服务器创建流程

    1 socket创建套接字 

    2 bind绑定ip和port 

    3 listen使套接字变为被动连接 

    4 accept等待客户端连接

    5 recv/send接收发送数据

  1 from socket import *
  2 serverSocket = socket(AF_INET,SOCK_STREAM)
  3 
  4 serverAdd = ("", 8899)
  5 
  6 serverSocket.bind(serverAdd)
  7 
  8 serverSocket.listen(5)
  9 clientSocket, clientAddr = serverSocket.accept()
 10 
 11 recvData = clientSocket.recv(1024)
 12 print(recvData)
 13     
 14 clientSocket.close()
 15 serverSocket.close()

TCP客户端连接流程

  1 from socket import *
  2 clientSocket = socket(AF_INET,SOCK_STREAM)
  3 
  4 serverAdd = ("127.0.0.1", 8899)
  5 
  6 clientSocket.connect(serverAdd)
  7 
  8 
  9 recvData = clientSocket.send(b"Hello World")
 10 
 11 clientSocket.close()

select 多路复用 socket的收发看做文件的读写

标准输入输出设备:stdin stdou stderr

  1 from socket import *
  2 import select
  3 import sys
  4 
  5 serverSocket = socket(AF_INET,SOCK_STREAM)
  6 serverAddr = ("", 8899)
  7 serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  8 serverSocket.bind(serverAddr)
  9 serverSocket.listen(4)
 10 inputs = [serverSocket, sys.stdin]
 11 runing = True
 12 while True:
 13     readable, writeable, exceptionable = select.select(inputs, [], [])
 14     for sock in readable:
 15         if sock == serverSocket:
 16             clientSock, clientAddr = serverSocket.accept()
 17             print("new connect")
 18             inputs.append(clientSock)
 19         elif sock == sys.stdin:
 20             runing = False
 21             break
 22         else:
 23             recvData = sock.recv(1024)
 24             if recvData:
 25                 sock.send(recvData)
 26             else:
 27                 print("close connect")
 28                 inputs.remove(sock)
 29                 sock.close()
 30     if not runing:
 31         break

epoll简单实现

  1 from socket import *
  2 import select
  3 import sys
  4 
  5 serverSocket = socket(AF_INET,SOCK_STREAM)
  6 serverAddr = ("", 8899)
  7 serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  8 serverSocket.bind(serverAddr)
  9 serverSocket.listen(4)
 10 #创建epoll对象
 11 epoll = select.epoll()
 12 #注册
 13 epoll.register(serverSocket.fileno(), select.EPOLLIN|select.EPOLLET)
 14 epoll.register(sys.stdin.fileno(), select.EPOLLIN|select.EPOLLET)
 15 connections = {}
 16 connectAddrs = {}
 17 runing = True
 18 while True:
 19     #epoll事件 
 20     pollList = epoll.poll()
 21     for fd,event in pollList:
 22         if fd == serverSocket.fileno():
 23             clientSock, clientAddr = serverSocket.accept()
 24             print("new connect")
 25             connections[clientSock.fileno()] = clientSock
 26             connectAddrs[clientSock.fileno()] = clientAddr
 27             epoll.register(clientSock.fileno(),select.EPOLLIN|select.EPOLLET)
 28         elif fd == sys.stdin.fileno():
 29             runing = False
 30             break
 31         else:
 32             recvData =  connections[fd].recv(1024)
 33             if recvData:
 34                 connections[fd].send(recvData)
 35             else:
 36                 print("close connect")
 37                 connections[fd].close()
 38                 epoll.unregister(fd)
 39                 connections.pop(fd)
 40     if not runing:
 41         break

<think>好的,用户的问题是:“请问python bitwise left shift operator result of 1<<21”。我需要先理解用户的问题,然后给出正确的解答。 首先,用户想知道Python中按位左移运算符的结果,特别是1左移21位后的结果。左移运算符在Python中用<<表示,其作用是将一个数的二进制表示向左移动指定的位数,右侧补零。 接下来,我需要回忆一下左移运算符的工作原理。例如,1<<3就是将1的二进制(即0b1)左移3位,变成0b1000,也就是8。同样的道理,1<<21应该是将1左移21位,得到的结果是2的21次方。 然后,我需要计算2的21次方的具体数值。2^10是1024,2^20是1,048,576,再乘以2得到2^21=2,097,152。因此,1<<21的结果应该是2,097,152。 为了确保正确性,我应该考虑Python中的整数大小是否有限制。但Python的整数是任意精度的,所以即使左移很多位也不会溢出,结果会正确显示。 另外,用户可能对位移操作不太熟悉,可能需要解释一下左移运算符的基本用法和常见应用场景,比如在加密算法、位掩码设置或性能优化中常用到位移操作。 同时,根据用户提供的引用资料,引用[2]提到Python的位移运算符属于按位运算符,用于对二进制位进行操作。这支持了我的解释的正确性。 最后,用户可能还想知道如何验证这个结果,可以建议他们直接在Python解释器中输入1<<21来查看输出,或者用print(bin(1<<21))来查看二进制形式,确认是否正确左移了21位。 总结一下,解答过程需要包括:左移运算符的定义、具体计算步骤、结果验证方法以及可能的相关应用或问题,帮助用户全面理解位移操作的结果和背后的原理。</think>在Python中,按位左移运算符`<<`会将二进制位向左移动指定次数,右侧补零。对于表达式`1 << 21`的运算过程如下: 1. **二进制表示** `1`的二进制为`0b1`,左移21位后变为`0b1`后跟21个零,即: $$0b1000000000000000000000$$ 2. **十进制转换** 该二进制数对应的十进制值为: $$2^{21} = 2,097,152$$ 3. **验证方法** 可直接在Python中运行以下代码验证: ```python print(1 << 21) # 输出 2097152 print(bin(1 << 21)) # 输出 '0b1000000000000000000000' ``` **相关特性** - 左移一位等价于乘以2,左移$n$位等价于乘以$2^n$[^2] - Python支持大整数运算,结果不受32/64位限制[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值