socket也可以认为是套接字是一种源IP地址和目的IP地址以及源端口号和目的端口号的组合.网络化的应用程序在开始任何通讯之前都必须要创建套接字.就像电话的插口一样,没有它就没办法通讯.
socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
看图说话socket作用:
如下图是socket的工作流程:
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
可以把socket连接过程想象成打电话,还是看实例更加形象,:
import socket ip_port=('127.0.0.1',8888) #买手机 s=socket.socket() #插卡 s.bind(ip_port) #开机 s.listen(5) #最大连接5个 #等待电话 conn,addr=s.accept() #conn就是电话的链路 #addr客户端的地址 #收消息 recv_data=conn.recv(1024) print("客户端发送类型:",type(recv_data),recv_data) #发消息 send_data=recv_data.upper() conn.send(send_data) #挂电话 conn.close() socket_server
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port=("127.0.0.1",8888) #买手机 s=socket.socket() #拨号 s.connect(ip_port) #发送消息 send_data=input(">>>>:").strip() s.send(bytes(send_data,encoding="utf-8")) #收消息 recv_data=s.recv(1024) print(str(recv_data,encoding="utf-8")) #挂电话 s.close() socket_client