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