[Python 网络编程] TCP、简单socket模拟ssh (一)
OSI七层模型(Open System Interconnection,开放式系统互联)
应用层
网络进程访问应用层:
为应用程序进程(例如:电子邮件、文件传输和终端仿真)提供网络服务;
提供用户身份验证 表示层
数据表示:
确保接收系统可以读出该数据;
格式化数据;
构建数据;
协商用于应用层的数据传输语法;
提供加密 回话层
主机间通信:
建立、管理和终止在应用程序之间的会话 传输层
传输问题:
确保数据传输的可靠性;
建立、维护和终止虚拟电路;
通过错误检测和恢复;
信息流控制来保证可靠性 网络层
数据传输:
路由数据包;
选择传递数据的最佳路径;
支持逻辑寻址和路径选择 数据链路层
访问介质:
定义如何格式化数据以便进行传输以及如何控制对网络的访问;
支持错误检测 物理层
二进制传输:单位比特
为启动、维护以及关闭物理链路定义了电器规范、机械规范、过程规范和功能
socket 实例化一个套接字
bind 绑定到地址和端口
listen 开始监听
accept 等待wait传入连接
recv 接受数据
send 发送数据(默认发送大小是32768(32k)大小)
sendall 发送所有数据
close 关闭socket
一、简单的通信过程
服务端:
import socket #实例化,绑定,监听,等待,解构(标识,ip-port),接收,回应,关闭
server = socket.socket() server.bind(('localhost',6969))
server.listen()
print('开始监听...') conn,addr = server.accept()
print(conn,addr) data = conn.recv(1024)
print('服务端接收到数据:',data.decode()) conn.send('Hi, i am the server.'.encode()) server.close()
客户端:
import socket #实例化,连接,发送,接收回应,关闭
client = socket.socket() client.connect(('localhost',6969)) client.send('Hi,i am the client.'.encode())
print('发送数据...') data = client.recv(1024)
print('客户端接收到数据:',data.decode()) client.close()
输出结果:
1. 先运行服务端,监听端口,开始等待传入数据:
开始监听...
2. 启动客户端,发送数据,接收响应:
发送数据...
客户端接收到数据: Hi, i am the server.
3. 回到服务端,查看接收到的数据:
开始监听...
<socket.socket fd=6, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 55149)> ('127.0.0.1', 55149)
接收到的数据: Hi,i am the client.
二、模拟ssh远程命令执行
服务器端:
import socket
import time
import os #实例化,绑定,监听,等待,解构(标识,ip-port),接收,响应,关闭
server = socket.socket() server.bind(('localhost', 6969))
server.listen(3) #表示当正在处理一个连接时,最多可以按顺序挂起接下来的3个连接(可以理解成排队),如果第4个来连接,过了一定时间就会抛出超时异常:TimeoutError: [Errno 60] Operation timed out
print('开始监听...') try:
while True:
conn,addr = server.accept()
# print(conn,addr)
peerip,peerport = conn.getpeername()
localip,localport = conn.getsockname()
print('{}:{} --> {}:{}'.format(peerip,peerport,localip,localport)) while True:
data = conn.recv(1024)
if not data:
break
print(data.decode())
ret = os.popen(data.decode()).read()
conn.send(ret.encode())
server.close()
except KeyboardInterrupt as e:
print('连接被中断...')
客户端
import socket #实例化,连接,发送,接收响应,关闭
client = socket.socket() client.connect(('localhost',6969))
print('正在连接服务端...') while True:
msg = input('>>>').strip()
# print('正在发送数据...')
if not msg:
continue
client.send(msg.encode())
# print('已发送...') data = client.recv(1024)
if not data:
break
print(data.decode()) client.close()
运行结果:
1. 服务端:
开始监听...
2. 客户端(可以输入执行的命令,接收到服务端返回的执行结果):
正在连接服务端...
>>>ls -l
total 48
-rw-r--r-- 1 zhangsan staff 222 Nov 10 10:37 1.0.py
-rw-r--r-- 1 zhangsan staff 433 Nov 10 16:49 2.0.py
-rw-r--r-- 1 zhangsan staff 158 Nov 10 23:18 error.log
-rw-r--r-- 1 zhangsan staff 437 Nov 11 14:10 socket_client1.py
-rw-r--r-- 1 zhangsan staff 1010 Nov 11 14:21 socket_server1.py
-rw-r--r-- 1 zhangsan staff 608 Nov 10 23:31 异常处理.py >>>ls -l ../
total 0
drwxr-xr-x 7 zhangsan staff 224 Nov 8 12:51 1106
drwxr-xr-x 11 zhangsan staff 352 Nov 9 11:33 1108
drwxr-xr-x 8 zhangsan staff 256 Nov 11 14:21 1110 >>>
3. 服务端:
开始监听...
127.0.0.1:56380 --> 127.0.0.1:6969
ls -l
ls -l ../ #记录执行的命令
协议簇:
AF_INET IPV4
AF_INET6 IPV6
AF_UNIX 本地地址
协议: Protocol
SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW 原始套接字,可伪造源IP等数据
[Python 网络编程] TCP、简单socket模拟ssh (一)的更多相关文章
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- Python 简单socket模拟ssh
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 表示层 回话层 传输层 tcp,udp 网络层 ip,icmp 数据链路层 mac地址 物理层 物理网 ...
- [Python网络编程]一个简单的TCP时间服务器
服务器端: 1.创建一个面向网络的TCP套接字对象socket, 2.绑定地址和端口 3.监听 4.当有客户端连接时候,接受连接并给此连接分配一个新的套接字 5.当客户端发送空信息时候,关闭新分配的套 ...
- python网络编程 - tcp
网络编程 低级别的网络服务 高级别的网络服务 socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. tcp 传输控制协议(Tra ...
- python 网络编程 -- Tcp协议
Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...
- python网络编程-TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- Python网络编程篇之socket
1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...
- [Python 网络编程] TCP Client (四)
TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户 ...
- python 网络编程 tcp和udp 协议
1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...
随机推荐
- 计算细胞数【BFS】
问题描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数. 输入格式 2行:第1行为两个整数 mm, nn, 代表矩阵 ...
- 二、hdfs单节点安装
一.准备环境 在配置hdfs之前,我们需要先安装好hadoop的配置,本文主要讲述hdfs单节点的安装配置. hadoop的单节点安装配置请参考:https://www.cnblogs.com/lay ...
- HTTP完整请求过程
重要申明:感谢原文作者——沐风的心,想看原文请戳这里!我借鉴了原文的页面请求流程,原文见时序图之后正文. 重要申明:感谢原文作者——一行两行,想看原文请戳这里!我借鉴了原文的完整HTTP请求流程. 增 ...
- 认识Groovy
什么是groovy: Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同. 在编写新应用 ...
- zoj 1037 最短路
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=37 找规律,水题 #include<iostream> #inclu ...
- hdu 2049 考新郎
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 和之前那道题一样,是错排,但是要乘上排列数. 选对的人有C(N,M)个组合,将它们排除掉,剩下的人就是错排了 #in ...
- docker 安装PIL python 报错 IOError: decoder zip not available
按照网上得方法:安装依赖库:yum install freetype freetype-develyum install libjpeg libjpeg-develyum install zlib z ...
- 理解position:relative
前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...
- MSSQL中的表变量
最近在看<Microsoft SQL Server2005技术内幕:T-SQL程序设计> 1.表变量的事务上下文中提到,表变量不受外部事务回滚影响. 举个例子: DECLARE @TA ...
- java中静态代码块的用法和static用法(转)
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程 ...