Socket抽象层(Socket编程)
基于TCP协议的借助 socket 可以编程客户端和服务端的程序
链接循环
通信循环
基于UDP协议的套接字(soket)编程
粘包现象
如何解决粘包现象
struck模块的使用
——————————————————————————————————————————Socket(套接字)是计算机网络编程中的一种抽象概念,它提供了在网络上进行通信的接口。通过使用 Socket,可以在不同计算机之间建立连接,并进行数据的传输和交换。
Socket 可以用于实现各种网络应用,例如:
1. 客户端-服务器通信:通过 Socket,客户端可以与服务器建立连接并发送请求,服务器接收请求并返回响应。
2. 网络聊天和即时通讯:通过 Socket,可以在多个用户之间实现实时的文字、音频或视频通信。
3. 文件传输:可以使用 Socket 在不同计算机之间传输文件,如上传和下载文件。
4. 远程控制:可通过 Socket 在远程计算机上执行指令或操作。
5. P2P(点对点)通信:Socket 提供了直接的点对点通信接口,允许两个或多个计算机直接进行数据交换。
具体使用 Socket 进行网络编程时,需要考虑协议、端口、IP 地址、数据格式等因素,以确保通信的正确性和有效性。不同编程语言和平台都有相应的 Socket API 和库,可以根据自己的需求选择合适的工具和技术。
套接字家族的名字:
AF_UNIX
unix一切皆文件
基于文件的套接字调用的就是底层的文件系统来取数据
两个套接字进程运行在同一机器
可以通过访问同一个文件系统间接完成通信
基于网络类型的套接字家族
套接字家族的名字:
AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现
所有地址家族中,AF_INET是使用最广泛的一个
python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
服务器端先初始化Socket
然后与端口绑定(bind),对端口进行监听(listen)
调用accept阻塞,等待客户端连接。
在这时如果有个客户端初始化一个Socket
然后连接服务器(connect)
如果连接成功,这时客户端与服务器端的连接就建立了。
客户端发送数据请求,服务器端接收请求并处理请求
然后把回应数据发送给客户端,客户端读取数据
最后关闭连接,一次交互结束
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
基于TCP的套接字
- tcp是基于链接的
- 必须先启动服务端
- 然后再启动客户端去链接服务端
基于UDP协议的套接字编程
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————粘包现象
import socket
import subprocess
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 9081)) # 0-65535:0-1024给操作系统使用
phone.listen(5)
print('starting......')
while True: # 链接循环
conn, client_addr = phone.accept()
print(client_addr)
while True: # 通信循环
try:
# 1、收命令
cmd = conn.recv(1024)
if not cmd: # 适用于linux操作系统
break
print('客户端的数据', cmd)
# 2、执行命令,拿到结果
obj = subprocess.Popen(cmd.decode('utf-8'), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
# 3、把命令的结果返回给客户端
print(len(stdout) + len(stderr))
conn.send(stdout+stderr)
except ConnectionResetError: # 适用于Windows操作系统
break
conn.close()
phone.close()