一个初学者的辛酸路程-socket编程-8
前言:
你会发现会网络是多么幸福的事情
主要内容:
socket 概念:
socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络通信都是基于IP地址加短裤的方法来定位到目标的具体机器上的具体服务。操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果把一个公司比做一台电脑,那公司的总机号码就相当于IP地址,每个员工的分机号就相当于短裤,你想找公司某个人,必须先打电话到总机,然后再转分机。
这里提到了OSI七层模型的概念:
第一层:物理层
第二层:数据链路层
第三层: 网络层
第四层:传输层
第五层:会话层
第六层:表示层
第七层:应用层
建立一个socket必须至少有2端,1个是服务端,1个是客户端,服务端被动等待并接受请求,客户端主动发起请求,连接建立之后,双方可以互发数据。
.png)
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("0.0.0.0",)) server.listen() conn,client_addr = server.accept() print(conn,client_addr) while True:
data = conn.recv() #1024字节
print("recv from cli:",data)
conn.send(b"got it")
client端
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket client = socket.socket() client.connect(("localhost",))
while True:
msg = input(">>:").strip()
if len(msg) == :continue
client.send(msg.encode())
print("send ",msg)
data = client.recv()
print("receive from server:",data)
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("0.0.0.0",)) server.listen() while True:
conn,client_addr = server.accept()
print(conn,client_addr) while True:
try:
data = conn.recv() #1024字节
print("recv from cli:",data)
conn.send(b"got it")
except ConnectionResetError as e:
print(e)
break
客户端
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket client = socket.socket() client.connect(("localhost",))
while True:
msg = input(">>:").strip()
if len(msg) == :continue
client.send(msg.encode())
print("send ",msg)
data = client.recv()
print("receive from server:",data)
接着写一个SSH连过去,执行命令的服务端和客户端
server端
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket
import subprocess server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("0.0.0.0",)) server.listen()
print("=============start to listen============")
while True:
conn,client_addr = server.accept()
print(conn,client_addr) while True: data = conn.recv() #1024字节
print("recv from cli:",data)
res_obj = subprocess.Popen(data,shell=True ,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
res = res_obj.stdout.read()
conn.send(str(len(res)).encode())
print("==res len:",len(res))
conn.send(res)
客户端
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket client = socket.socket() client.connect(("localhost",))
while True:
msg = input(">>:").strip()
if len(msg) == :continue
client.send(msg.encode())
print("send ",msg) data = client.recv()
print("res:",data.decode())
res_len = int(data.decode()) recevied_size =
res = b''
while recevied_size < total_size:
d = client.recv()
res += d recevied_size += len(d)
print(res.decode())
最后做一个持续接受的server端和client端
服务端
[root@docker20- ~]# cat server.py
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket
import subprocess
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",))
server.listen()
print("--------------start to listen------------------") while True:
conn,client_addr = server.accept()
print(conn,client_addr) while True:
data = conn.recv()
print("recv from cli:",data)
res_obj = subprocess.Popen(data,shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
res = res_obj.stdout.read()
conn.send(str(len(res)).encode())
print("--res len:",len(res))
conn.send(res)
客户端
#!/usr/bin/env python
# -*- coding: utf- -*-
#Author: Leon xie import socket client = socket.socket() client.connect(("10.10.20.127",)) while True: msg = input(">>:").strip()
if len(msg) == :continue client.send(msg.encode())
print("send",msg)
data = client.recv()
print("res:",data.decode())
total_size = int(data.decode())
#总长度跟已经收到的相等即可 received_size =
res=b''
while received_size <total_size:
d = client.recv()
res += d received_size += len(d) print("---------------rece done------------")
print(res.decode())
完结。
一个初学者的辛酸路程-socket编程-8的更多相关文章
- 一个初学者的辛酸路程-python操作SQLAlchemy-13
前言 其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒.今天呢,要说的就是如何使用Python来操作数据库. SQLAlchemy SQLAlchemy是Python编程语言下的一款O ...
- 一个初学者的辛酸路程-FTP-9
前言 今天,我要描述一个FTP的故事 主要内容 嗯,今天主要以阶梯性的形式来做一个FTP项目. 第一步: 我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯. 服务 ...
- 一个初学者的辛酸路程-初识Python-1
前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...
- 一个初学者的辛酸路程-初识Django
前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...
- 一个初学者的辛酸路程-Python基础-3
前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...
- 一个初学者的辛酸路程-了解Python-2
前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...
- 一个初学者的辛酸路程-依旧Django
回顾: 1.Django的请求声明周期? 请求过来,先到URL,URL这里写了一大堆路由关系映射,如果匹配成功,执行对应的函数,或者执行类里面对应的方法,FBV和CBV,本质上返回的内容都是字符串 ...
- 一个初学者的辛酸路程-继续Django
问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...
- 一个初学者的辛酸路程-jQuery
前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...
随机推荐
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- Winform常用开发模式第一篇
Winform常用开发模式第一篇 上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了 ...
- 那天有个小孩教我WCF[一][1/3]
那天有个小孩教我WCF[一][1/3] 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不 ...
- Cygwin 各种情况下中文乱码--终极解决方案
0.引言 本人从进公司以来一直负责公司Android平台下产品的NDK开发,用的工具: 01. Google的adt-bundle(集成了eclipse和sdk) 02. NDK 03. Cygwin ...
- Software Industry Revolution----POJ3898----DP
题目地址:http://poj.org/problem?id=3898 题目意思: 给你一个模式串,再给你一个原串,要你去匹配 模式串里面的?可对应任意一个字符 *号可对应0个或多个字符 其中a=1, ...
- HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP
dp [ x ] [ y ] [ z ] 表示二进制y所表示的组合对应的之和mod x余数为z的最小数... 如可用的数字为 1 2 3 4...那么 dp [ 7 ] [ 15 ] [ 2 ] = ...
- Android---控制设备照相机
本文译自:http://developer.android.com/training/camera/cameradirect.html 本文中,我们讨论如何使用框架API来直接的控制照相机硬件. 直接 ...
- java String源码学习
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ...
- .NET基础——数组
这一篇,我们来看C#中的数组. 1. 数组的概念 数组:存储相同类型多个数据元素的容器 数组的声明和初始化: 在创建数组的时候,必须指定数组的长度 ]; ,, }; ] { , , };//数组元素的 ...
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...