socket套接字.
五层协议: 从传输层包括传输层一下,都是操作系统帮助我们封装的各种head.你不用去关心.
# content = input('>>>') # print(content) # 怎么交给操作系统( ⊙o⊙ )? # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统. # socket套接字充当的就是内置模块的角色. # 你说一下socket的套接字? ''' socket 套接字,它存在于传输层与应用层之间的抽象层, 1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口. 直接使用这些接口或者方法即可,使用起来方便,提升开发效率. 2. socket就是一个模块.通过使用学习模块提供的功能, 建立客户端与服务端的通信,使用方便. '''
基于TCP协议的socket通信.
单个客户与服务端通信.
服务端:
# content = input('>>>') # print(content) # 怎么交给操作系统( ⊙o⊙ )? # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统. # socket套接字充当的就是内置模块的角色. # 你说一下socket的套接字? ''' socket 套接字,它存在于传输层与应用层之间的抽象层, 1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口. 直接使用这些接口或者方法即可,使用起来方便,提升开发效率. 2. socket就是一个模块.通过使用学习模块提供的功能, 建立客户端与服务端的通信,使用方便. '''
客户端:
import socket # 1. 创建socket对象(买手机) phone = socket.socket() # 可以默认不写 # 连接服务器ip地址与端口 phone.connect(('127.0.0.1', 8848)) # 发消息 to_server = input('>>>').strip() phone.send(to_server.encode('utf-8')) # 接收消息 from_server_data = phone.recv(1024) # 夯住,等待服务端的数据传过来 print(f'来自服务端消息:{from_server_data.decode("utf-8")}') # 关机 phone.close()
通信循环.
服务端:
import socket phone = socket.socket() phone.bind(('127.0.0.1', 8888)) phone.listen(5) # 4. 接收连接 while 1: print('start') conn, addr = phone.accept() # 程序夯住 print(conn,addr) while 1: try: from_client_data = conn.recv(1024) # 至多接收1024个字节 if from_client_data == b'q': break print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}') to_client = input('>>>') conn.send(to_client.encode('utf-8')) except ConnectionResetError: break conn.close() phone.close()
客户端:
import socket # 1. 创建socket对象(买手机) phone = socket.socket() # 可以默认不写 # 连接服务器ip地址与端口 phone.connect(('127.0.0.1', 8888)) # 发消息 while 1: to_server = input('>>>').strip() if to_server.upper() == 'Q': phone.send('q'.encode('utf-8')) break phone.send(to_server.encode('utf-8')) # 接收消息 from_server_data = phone.recv(1024) # 夯住,等待服务端的数据传过来 print(f'来自服务端消息:{from_server_data.decode("utf-8")}') # 关机 phone.close()
通信,连接循环.
服务端:
# import socket # # # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # # 1. 创建socket对象(买手机) # phone = socket.socket() # 可以默认不写 # # # 2. 绑定ip地址和端口(办卡) # phone.bind(('127.0.0.1', 8848)) # 本地回环地址 # # # 3. 监听.(开机状态) # phone.listen(5) # # # 4. 接收连接 # print('start') # conn, addr = phone.accept() # 程序夯住 # # print(conn,addr) # while 1: # from_client_data = conn.recv(1024) # 至多接收1024个字节 # print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}') # to_client = input('>>>') # conn.send(to_client.encode('utf-8')) # # conn.close() # phone.close() # 无论你的客户端是否正常关闭,服务端都应该正常关闭,而不是报错. import socket # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 1. 创建socket对象(买手机) phone = socket.socket() # 可以默认不写 # 2. 绑定ip地址和端口(办卡) phone.bind(('127.0.0.1', 8888)) # 本地回环地址 # 3. 监听.(开机状态) phone.listen(5) # 4. 接收连接 print('start') conn, addr = phone.accept() # 程序夯住 # print(conn,addr) while 1: try: from_client_data = conn.recv(1024) # 至多接收1024个字节 if from_client_data == b'q': break print(f'来自客户端{addr}消息{from_client_data.decode("utf-8")}') to_client = input('>>>') conn.send(to_client.encode('utf-8')) except ConnectionResetError: break conn.close() phone.close()
客户端:
import socket # 1. 创建socket对象(买手机) phone = socket.socket() # 可以默认不写 # 连接服务器ip地址与端口 phone.connect(('127.0.0.1', 8888)) # 发消息 while 1: to_server = input('>>>').strip() if to_server.upper() == 'Q': phone.send('q'.encode('utf-8')) break phone.send(to_server.encode('utf-8')) # 接收消息 from_server_data = phone.recv(1024) # 夯住,等待服务端的数据传过来 print(f'来自服务端消息:{from_server_data.decode("utf-8")}') # 关机 phone.close()
利用socket完成获取远端命令的示例.
while 1: try: from_client_data = conn.recv(1024) #至多接受1024字节 obj = subprocess.Popen(from_client_data.decode("utf_8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) result = obj.stdout.read()+ obj.stderr.read() conn.send(result) except ConnectionResetError: break
黏包现象.
今日总结
名词,协议整理.
转载于:https://www.cnblogs.com/W-Y-C/p/11196067.html