前言:

你会发现会网络是多么幸福的事情

主要内容:

socket 概念:

socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络通信都是基于IP地址加短裤的方法来定位到目标的具体机器上的具体服务。操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果把一个公司比做一台电脑,那公司的总机号码就相当于IP地址,每个员工的分机号就相当于短裤,你想找公司某个人,必须先打电话到总机,然后再转分机。

这里提到了OSI七层模型的概念:

第一层:物理层

第二层:数据链路层

第三层: 网络层

第四层:传输层

第五层:会话层

第六层:表示层

第七层:应用层

建立一个socket必须至少有2端,1个是服务端,1个是客户端,服务端被动等待并接受请求,客户端主动发起请求,连接建立之后,双方可以互发数据。

建立一个链接,需要IPV4和IPV6
Socket Types
socket.SOCK_STREAM     #for tcp
socket.SOCK_DGRAM     #for  udp
socket.SOCK_RAW      #原始套接字
建立链接之后,就需要IP和端口了
排队数量,一般是5
sk.listen(backlog)
关闭套接字
sk.close()
接受套接字的数据
sk.recv(bufsize[,flag])
 
具体步骤
1、生成一个socket实例
 
server = socket.socket(AF_INET,SOCK_STREAM)
2、绑定地址
server.bind('0.0.0.0',8000)
3、监听端口排队5个
server.listen(5)
 
4、接受
talk_list = []
server.accept()   会返回2个值 conn 建立链接的线   client_addr 链接对象
talk_list.append(conn)
conn.send('sdfds') 
另外一个介入进来
conn.recv('sdfsf')
5、发送
server.send()
6、关机
server.close()
 
上面是服务端
 
客户端通信
client = socket.socket(AF_INET,SOCK_STREAM)
client.connect('')
client.send
client.recv
 
接下来,就通过代码来实现这个服务端和客户端
server端
#!/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)
再开一个client的时候,会出现堵死的情况,断开一个,另外一个可以使用了。
所以上面的可以改良
 
server端
#!/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的更多相关文章

  1. 一个初学者的辛酸路程-python操作SQLAlchemy-13

    前言 其实一开始写blog,我是拒绝的,但是,没办法,没有任何理由抗拒.今天呢,要说的就是如何使用Python来操作数据库. SQLAlchemy SQLAlchemy是Python编程语言下的一款O ...

  2. 一个初学者的辛酸路程-FTP-9

    前言 今天,我要描述一个FTP的故事 主要内容 嗯,今天主要以阶梯性的形式来做一个FTP项目. 第一步: 我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯. 服务 ...

  3. 一个初学者的辛酸路程-初识Python-1

    前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 初识Python 一.它的爸爸是谁 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏 ...

  4. 一个初学者的辛酸路程-初识Django

    前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...

  5. 一个初学者的辛酸路程-Python基础-3

    前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...

  6. 一个初学者的辛酸路程-了解Python-2

    前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...

  7. 一个初学者的辛酸路程-依旧Django

    回顾: 1.Django的请求声明周期?   请求过来,先到URL,URL这里写了一大堆路由关系映射,如果匹配成功,执行对应的函数,或者执行类里面对应的方法,FBV和CBV,本质上返回的内容都是字符串 ...

  8. 一个初学者的辛酸路程-继续Django

    问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py  ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...

  9. 一个初学者的辛酸路程-jQuery

    前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...

随机推荐

  1. 构建RESTful风格的WCF服务

    构建RESTful风格的WCF服务 RESTful Wcf是一种基于Http协议的服务架构风格. 相较 WCF.WebService 使用 SOAP.WSDL.WS-* 而言,几乎所有的语言和网络平台 ...

  2. zoj1537- Playing with a Calculator

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=537 题意:给你一个k值,现在要你求一个最小的N 值,N每一个数位上的数值a均相 ...

  3. Java中数组Arrays.binarySearch,快速查找数组内元素位置

    在数组中查找一个元素,Arrays提供了一个方便查询的方法.Arrays.binarySearch(): 测试列子: public class MainTestArray { public stati ...

  4. 微信小程序开源项目库汇总

    最近做了一个微信小程序开源项目库汇总,里面集合了OpenDigg 上的优质的微信小程序开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 ...

  5. js判断获取浏览器关闭状态

    如题,js获取浏览器关闭状态,可实现判断选择是否关闭. <html> <head> <title> </title> </head> < ...

  6. STM32 Keil查看程序占用ROM和RAM

    1. 编译生成的map文件中code , RO ,RW, ZI 表示内容 Code为程序代码部分 RO-data 表示 程序定义的常量const temp; RW-data 表示 已初始化的全局变量 ...

  7. 第17章 使用PHP和MySQL实现身份验证

    1.对密码进行加密:sha1(string str,bool raw_output) //将返回一个40个字符的伪随机字符串,若raw_output为true,着得到一个20个字符的二进制字符串数据 ...

  8. Cracking the Coding Interview 第二章

    2.2 链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个结点. 思路:快慢指针(error: 判断是否有可行解,否则返回null, while, if 后加空格) /* public cla ...

  9. linux 下查看cpu是几核的

    几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) more /proc/cpu ...

  10. Linux的一些简单命令(二)

    1.查看防火墙状态:service iptables status 2.开启防火墙:service iptables start 3.关闭防火墙:service iptables stop 4.创建目 ...