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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值