Socket 是进程之间通讯的一种方式, 调用 socket 网络库中的 API 函数实现不同主机相关进程的数据交换网络中所有涉及通讯的设备都需要 scoket
首先我们需要了解一下相关概念
1IP 地址: 根据 TCP/IP 协议分配给网络中主机的唯一网络地址, 该地址是网络通讯中必须知道的
2 端口号: 主机内部用来区分本地通讯进程的, 一个进程必须有一个端口号
3 连接: 指两个进程之间的通讯链路
4 半相关: 网络中用一个三元组可以子在全局唯一标识一进程 (三元组: 协议, 本地地址, 本地端口号)
5 全相关: 一个完整的网间进程通讯是需要两个进程组成 (高层协议一致), 一个完整的通讯是需要一个五元组标识
(五元组: 协议, 本地 ip, 本地端口, 目的 ip, 目的端口)
Python 中 socket 是通过调用 socket 模块, 调用里面的相关函数实现 tcpudp 通讯
socket 编程思路:
TCP 服务端:
创建套接字, 绑定套接字到本地 IP 与端口
- socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.bind()
开始监听连接
s.listen()
进入循环, 不断接受客户端的连接请求
s.accept()
然后接收传来的数据, 并发送给对方数据
- s.recv()
- s.sendall()
传输完毕后, 关闭套接字
s.close()
TCP 客户端:
创建套接字, 连接远端地址
- socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.connect()
连接后发送数据和接收数据
- s.sendall()
- s.recv()
传输完毕后, 关闭套接字
- s.close()
- =============================================
UDP 通讯实现:
- # 创建套接字
- udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- # 设置接收方 ip 端口 (ip, port)
- dest_addr = ()
- # 绑定本地端口 (ip, 端口)ip 不填写默认检测所有本地 ip
- localip_addr =()
- udp_socket.bind()
- # 获取输入数据
- send_data = input()
- # 发送数据
- udp_socket.sendto(send_data.encode("utf-8"), dest_addr)
- # 接受数据
- recv_data = udp_socket.recvfrom(1024)
- # 打印接受的数据, window 用 gbk,linux 默认 utf-8
- print(recv_data[0].decode("gbk"))
- for tmp in recv_data[1]:
- print(tmp)
- # 关闭套接字
- udp_socket.close()
来源: http://www.bubuko.com/infodetail-2543496.html