socket套接字
五层协议:从传输层包括传输层以下,都是操作系统版主我们封装的各种head
套接字:他存在于传输层与应用层之间的抽象层
? 1.避免你学习各层的接口以及协议的使用 socket已经封装好了所有的接口.直接使用这这些接口或者方法即可,提升开发效率.
? 2.在Python中socket就是一个模块.通过调用模块中已经实现的方法建立两个进程之间的通信.
单个客户端通讯
# client端
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()
# server端
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)
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()
通讯循环
# client
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()
# server
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()
执行远端命令
# client
import socket
phone = socket.socket()
phone.connect(('127.0.0.1', 8888))
# 发消息
while 1:
cmd = input('>>>').strip()
phone.send(cmd.encode('utf-8'))
# 接收消息
result = phone.recv(1024) # 夯住,等待服务端的数据传过来
print(result.decode('gbk'))
# 关机
phone.close()
# server
import socket
import subprocess
phone = socket.socket()
phone.bind(('127.0.0.1', 8888))
phone.listen(5)
# 4. 接收连接
print('start')
conn, addr = phone.accept()
while 1:
try:
cmd = conn.recv(1024) # dir
obj = subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
result = obj.stdout.read() + obj.stderr.read()
conn.send(result)
except ConnectionResetError:
break
conn.close()
phone.close()
网络协议梳理
# 应用层: 软件自定制协议.FTP,HTTP.
你形成了一个数据: '今天聚餐,别迟到'
数据size, md5这两个参数组成了报头head
飞信: data = {'size': 22, 'md5': 'e4rrewr345345643' ,'content': '今天聚餐,别迟到'}
# 传输层: 端口协议. 封装了端口.确定软件在计算机的位置.
tcp(端口号: 9000) |data = {'size': 22, 'md5': 'e4rrewr345345643' ,'content': '今天聚餐,别迟到'}
# 网络层: ip协议.
IP协议(源ip地址, 目标ip地址)|tcp(端口号: 9000) |data = {'size': 22, 'md5': 'e4rrewr345345643' ,'content': '今天聚餐,别迟到'}
# 数据链路层: 以太网协议. mac地址
以太网协议(源mac地址,目标mac地址 数据类型)|IP协议(源ip地址, 目标ip地址)|tcp(端口号: 9000) |data = {'size': 22, 'md5': 'e4rrewr345345643' ,'content': '今天聚餐,别迟到'}
# 物理层: 转化成bite流发出去.
原文地址:https://www.cnblogs.com/lyoko1996/p/11201842.html
时间: 2024-10-10 18:04:13