[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来讲,传输速度慢,消息是 ...
随机推荐
- C# 请求Https
/// <summary> /// Get请求 /// </summary> /// <param name="Url"></param& ...
- 十、获取异步线程返回值Callable
一.简介 异步线程的实现接口Runnable是无法获得返回结果的,而另一个接口Callable可以返回结果.并通过如Future等方式来获取异步结果. 二.代码示例 import java.util. ...
- Maven环境的搭建
1.本地仓库和apache-mavenbin.zip的下载与解压 <1.apache-mavenbin.zip下载网址 http://maven.apache.org/download.cgi ...
- groovy函数、字符串、循环
三重单引号字符串 '''a triple single quoted string''' 三重单引号字符串是普通的java.lang.String 三重单引号字符串是多行的.您可以跨越行边界跨越字符串 ...
- 常见IT英语单词
lable标签,master精通.主人,reference参考,release发布,schema模式,component组件,persistence持久化,generate生成产生,plugin插件, ...
- POJ 2184(01背包)(负体积)
http://poj.org/problem?id=2184 http://blog.csdn.net/liuqiyao_01/article/details/8753686 对于负体积问题,可以先定 ...
- java io简单使用
public class CreateFile { public static void main(String[] args) { /* * 文件夹的创建和文件的生成 */ File f1 = ne ...
- c++实现全密码生成
这里所谓的“全密码”指的是指定字符串中所有可能出现的密码.以字符串“0123456789”为例,可能出现的2位密码会有100个,即L^N个.(L代表字符串的长度,N代表要生成密码的位数). 第一种方法 ...
- 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异[转]
看的文章来自: https://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs 使用 ...
- vue学习(一)、Vue.js简介
Vue.js 五天 汤小洋一. Vue.js简介1. Vue.js是什么Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e 版本:v1.0 v2.0 是一个构建用户界面的框架 ...