网络编程(二)——socket(套接字)
1、什么是socket?
由图可见, socket是连接应用层和运输层的中间层,它就是一组接口,它是应用程序访问下层网络服务的接口。
网络通信需要遵循一堆协议(如图中的TCP/UDP等),协议即标准,如果想开发一款基于网络通信的软件,就必须遵循这些标准。但是,深入理解TCP/UDP等协议并运用太过复杂,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出来的程序自然就是遵循TCP/UDP标准的。
2、socket种类
socket有两种,分别是基于文件型和基于网络型。
-
基于文件型:AF_UNIX 基于网络型:AF_INET
3、socket工作流程
使用socket是为了通信,所以把socket工作流程想象成现实中生活情境就容易理解了。
比如:
我要给一位朋友打电话,我先拨号——> 朋友听到电话铃声——>朋友接通电话——>我们建立起连接便可以通话了——>聊天结束——>我们挂掉电话。
socket的工作流程也是如此。
服务端先初始化socket——>然后和端口绑定(bind)——>对端口进行监听(listen)——>调用accept阻塞——>等待客户连接。
客户端初始化一个socket——>连接服务器(connect)——>开始和服务器通信。
客户端发送数据请求——>服务端接受、处理请求——>然后将回应数据发送给客户端——>客户端读取数据——>最后关闭连接——>一次交互结束。
代码演示:
注意要先运行服务端,先运行客户端会报错(Connection refused),因为此时没有服务端监听端口。
服务端代码:
import socket # 模拟情景:给别人打电话的流程 # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2、绑定手机卡 phone.bind(("127.0.0.1",8080)) # 3、开机 phone.listen(5) # 4、等电话链接 print("starting...") conn,client_addr = phone.accept() # 5、收、发消息 while True: data = conn.recv(1024) print("客户端的数据",data) conn.send(data.upper()) # 6、挂电话 conn.close() # 7、关机 phone.close()
客户端代码:
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2、拨号 phone.connect(("127.0.0.1",8080)) # 3、发、收消息 while True: msg = input(">>:").strip() phone.send(msg.encode("utf-8")) data=phone.recv(1024) print(data) # 4、关闭 phone.close()
上一篇:
Java架构师技术进阶路线图
下一篇:
花式讲解校园网绕过认证原理