socket套接字
-
为何学习socket一定要先学习互联网协议?
-
首先C/S架构是基于网络通信的
然后网络的核心即一堆网络协议,也就是协议标准。如果你想开发一款基于网络通信的软件,就必须遵循这些标准
-
-
socket层:socket处于应用层与传输层之间,提供了一些简单的接口. 避免与操作系统之间对接,省去了相当繁琐复杂的操作.socket在python中属于一个模块.为我们提供了这些简单的功能.
-
socket是什么?
-
socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
-
-
基于TCP协议的socket
- 套接字的分类:
- 基于文件类型的套接字家族:AF_UNIX(在Unix系统上,一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程同时运行在同一机器,可以通过访问同一个文件系统间接完成通信)
- 基于网络类型的套接字家族:AF_INET (python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只使用AF_INET)
- 套接字的工作流程:
- 例子:如果你要给你的一个朋友打电话,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
- 例子:如果你要给你的一个朋友打电话,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
- 套接字的分类:
-
套接字函数
-
服务端套接字函数:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 1.服务端套接字函数 phone.bind('主机ip地址',端口号) #绑定到(主机,端口号)套接字 phone.listen() #开始TCP监听 phone.accept() #被动接受TCP客户的连接,等待连接的到来
-
客户端套接字函数:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机 phone.connect() #主动连接服务端的ip和端口 phone.connect_ex() #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常
-
服务端和客户端的公共用途的嵌套字函数:
phone.recv() #接受TCP数据 phone.send() #发送TCP数据 phone.recvfrom() #接受UDP数据 phone.sendto() #发送UDP数据 phone.getpeername() #接收到当前套接字远端的地址 phone.getsockname() #返回指定套接字的参数 phone.setsockopt() #设置指定套接字的参数 phone.close() #关闭套接字
-
server:
import socket # 买电话 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket # 绑定电话卡 phone.bind(('192.168.14.198',8848)) # 绑定IP地址和端口 # 开机监听 phone.listen(5) print(111) # 等待连接 conn, addr = phone.accept() # 阻塞 print(conn,addr) from_client_data = conn.recv(1024) # 至多接受1024个字节 阻塞 print(f'来自客户端{addr[0]}的消息:{from_client_data.decode("utf-8")}') to_client_data = input('>>>') conn.send(to_client_data.encode('utf-8')) conn.close() phone.close()
-
client
import socket # 买电话 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 默认基于TCP协议的socket # 拨号打电话 phone.connect(('127.0.0.1',8848)) data = input('请输入>>>') phone.send(data.encode('utf-8')) from_server_data = phone.recv(1024) print(f'来自服务端的消息:{from_server_data}') # 关闭电话 phone.close()
-