Socket网络编程介绍
背景
两台电脑之间的通信是通过网络来传输的,传输的是bit流,实现通信是使用IP+端口,把网络删的相关传输进行封装,仅暴露一些接口,这些接口即socket;
so,对tcp及udp等网络协议的封装即socket;
socket只干两件事情<发数据send,收数据receive>
两台设备间通信
步骤一:首先两台设备需要import socket
步骤二:两台设备声明socket.TCP/IP相同协议类型,声明地址簇<Socket Families>及协议类型<Socket protocol types>
步骤三:后面步骤如下图
地址簇<Socket Families>
- socket.AF_UNIX 本机进程间通信,也到本地的localaddress<127.0.0.1>转一下发送给另外进程
- socket.AF_INET IPV4
- socket.AF_INET6 ipv6
协议类型<Socket protocol Types>
- socket.SOCK_STREAM # for tcp
- socket.SOCK_DGRAM # for udp
- socket.SOCK_RDM # 是一种可靠的UDP形式,即保证交付数据报大拿不保证顺序;
- socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP及IGMP等网络报文,而SOCK_RAW;
注:SOCK_RAW也可以处理特殊的IPV4报文,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP地址头
Socket编程实例
最简单的客户端及服务端通信的实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 导入socket模块 import socket # 声明socket类型,同时生成socket连接对象(括号内为地址簇及协议类型,默认即这两种) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 与server地址(一个包含ip及端口的tuple)建立连接 client.connect(('localhost', 9988)) # 循环的收发数据 while True: msg = input(">>:") if msg.startswith("quit"): break # 发送数据 # 注意无法send空,空server端认为你还在发,send也是有限制的 # send是有个缓冲区的,如果一次没发完的全存在着,下次发,发的是缓冲的; # 这个缓冲区是有个大小的,如果缓冲区被占满,下次会扩充...<> # sendall 循环发send client.send(msg.encode(encoding='utf-8')) # # 收取数据 # 定义收多少数据,收可以很大,但也有限制,recv是有限制的,官方建议小于8192bit data = client.recv(1024) print(data) client.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
服务端可以反复的和客户端进行通信<但一次只有一个>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', 6969)) server.listen(5) f = open("E:\\shipin.flv", 'rb') video = f.read() print(len(video)) f.close() # 通过循环的方式可以反复的建立链接 while True: conn, addr = server.accept() try: while True: # 通过循环的方式可以反复的收发消息 data = conn.recv(1024) print(data) if not data: conn.close() break conn.sendall(video) except ConnectionResetError: continue server.close()
end