Pythony运维入门之Socket网络编程详解


Posted in Python onApril 15, 2019

Socket是什么?

Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输

首先,简单了解一下TCP通信过程:

Pythony运维入门之Socket网络编程详解

TCP三次握手(面试常考):
第一次握手:客户端 发送SYN报文,设置随机数序号X,服务器由SYN=1知道,客户端要求建立联机

第二次握手:服务器端接收到客户端的报文之后,经过处理,返回给客户端SYN+ACK报文,同时设置随机序号Y,此时返回的报文确认ACK=X+1

第三次握手:接收到报文的客户端,会在处理确认之后,再发送一个报文给服务器端,此时确认为ACK=Y+1

服务器端接收到客户端发送的报文之后,会在服务器端与客户端形成一种通路,此后的数据就可以在这个通路上就可以传输。

Socket使用TCP协议的通信过程与上述相当类似:

Pythony运维入门之Socket网络编程详解

Socket通信方式

Socket分为TCP和UDP两种不同的通信方式

为什么选择 Socket?

Socket是基础应用,适应多种网络协议,服务器的传输大量涉及网络协议,离不开Socket的应用

以下编写简单的服务器和客户端程序(以本机为例):
服务器端程序:

导入socket模块(需要预先pip)
import socket
#创建实例
sk = socket.socket()  #鼠标放在内建函数上,Ctrl+B,可以查看源码
ip_port = ("127.0.0.1",8888)  #绑定ip和port,以本机(127.0.0.1)和其他端口(8888)为例
sk.bind(ip_port)  #绑定监听
sk.listen(5)  #最大连接数,大多数程序设置5足够

print("正在接受数据")  #打印一行提示信息

conn,address =sk.accept()  #接收数据
msg ="hello world" #定义数据
conn.send(msg.encode())  #返回信息 , python3发送和接收网络数据是byte类型,如果发送的是str类型就需要进行编码
conn.close()  #关闭连接

客户端程序:

#导入socket模块
import socket

client = socket.socket() #实例初始化
ip_port = ("127.0.0.1", 8888) #访问服务器端的ip和端口

client.connect(ip_port) #连接服务器
data = client.recv(1024) #接收服务器信息
print(data.decode()) #打印信息,python3是传输byte类型 ,需要编码。

实现socket客户端一次连接中连续消息发送:

server端:

#导入socket模块
import socket
import random

sk=socket.socket() #创建实例
ip_port =("127.0.0.1",8888) #定义绑定IP和port
sk.bind(ip_port) #绑定监听
sk.listen(5) #设置最大连接数

while True:  #连续接收数据
 print("正在等待接收数据。。。。。")  #提示信息
 server,address=sk.accept() #接收数据
 msg='欢迎来到socket世界'  #定义信息
 server.send(msg.encode())  #返回信息
 while True:    #连续接受客户端发送的消息
   data=server.recv(1024)  #接收客户端信息
   print(data.decode())  #打印获取的数据,实际开发生产一般不打印
   if data == b'exit':    #接收到退出命令
    break
   sever.send(data.encode())  #处理客户端数据
   sever.send(str(random.randint(1,50000)).encode())   #发送随机数据信息
 conn.close()  #主动关闭连接

client端:

import socket #导入模块

client=socket.socket()  #实例初始化
ip_port =("127.0.0.1",8888) #访问服务端IP和端口
client.connect(ip_port)  #连接sever端

while True:         #定义循环,发送消息
  date = client.recv(1024)   # 接收sever端信息
  print(data.decode())   # 打印接收数据
  
  msg_input=input("请输入发送的信息:")  #输入发送的信息
  client.send(msg_input.encode())   #消息发送
  if msg_input == "exit":     #接收到退出命令
  break
  
  data= client.recv(1024)    #接收sever端信息
  print(date.decode())     #打印接收的消息

上述是一个客户端连接服务器,接下来介绍多个客户端连接服务器:

首先对socket参数进行了解:

参数一:family地址簇

Pythony运维入门之Socket网络编程详解

参数二:type类型

Pythony运维入门之Socket网络编程详解

参数三:proto协议号

Pythony运维入门之Socket网络编程详解

socket UDP通信:

服务器端:

import socket

sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8888)
sk.bind(ip_port)
while True:
  data = sk.recv(1024)
  print(data.decode()) #bytes--->(decode)--->str

客户端:

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
in_port = ("127.0.0.1",8888)

while True:
  msg_input = input("输入需要发送的信息:")
  if msg_input == "exit":
   break
  client.sendto(msg_input.encode(),in_port)  # str--->(encode)--->bytes
client.close()

socket非阻塞模块:

前面谈到的实例程序TCP socket存在阻塞,python能否实现非阻塞TCP通信,显然是可以的,不然python也不会发展这么强大。

实现途径:导入socketsever ,用多线程的方式实现非阻塞——继承socketsever对象重载setup、handle、finish方法。

import socketserver
#定义一个类
class Myserver(socketserver.BaseRequsetHandler):
 #如果handle方法报错,则会跳过
 #setup和finish方法无论如何都会执行
 #首先执行setup方法
 def setup(self):
  pass
 #然后执行handle方法
 def handle(self):
  #定义连接变量
  conn = self.request
  msg='欢迎来到socket世界'  #定义信息
  conn.send(msg.encode())  #返回信息
  while True:    #连续接受客户端发送的消息
   data=conn.recv(1024)  #接收客户端信息
   print(data.decode())  #打印获取的数据,实际开发生产一般不打印
   if data == b'exit':    #接收到退出命令
    break
   conn.send(data.encode())  #处理客户端数据
   conn.send(str(random.randint(1,50000)).encode())   #发送随机数据信息
  conn.close()
 #最后执行finish方法 
 def finish(self):
  pass

if name == "__main__":
 #创建多线程实例
 server = socketserver.ThreadingTCPServer((“127.0.0.1",8888),Myserver)
 #开启异步多线程,等待连接
 server.serve_forever()`

然后用之前的TCP客户端程序实现非阻塞多客户端通信

实例——文件上传程序:

运维通常会遇到文件上传的情况,同时没有第三方软件的时候,这个时候我们 可以自己实现文件上传
文件接收端(server):

import socket

sk = socket.socket() 
ip_port = ("127.0.0.1",9999)  
sk.bind(ip_port)  
sk.listen(5) 
while True:
 conn,adress = sk.accept()
 with open("file","ab") as f: #ab可添加二进制模式
  data = conn.recv(1024)
  if data == b"exit":
   break
  f.write(data)
sk.close()

文件发送端(本机)(client):

import socket
#发起连接
sk = socket.socket() 
ip_port = ("127.0.0.1", 9999) #服务器的端口
sk.connect(ip_port) 
#打开文件 
with open(”test.py“,”rb“) as f:
 for i in f:
  sk,send(i)
sk.send("exit",encode()) #结束信号

以上所述是小编给大家介绍的Pythony运维入门之Socket网络编程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现list反转实例汇总
Nov 11 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
Python程序运行原理图文解析
Feb 10 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
Django models.py应用实现过程详解
Jul 29 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
用python批量下载apk
Dec 29 Python
pandas中DataFrame重置索引的几种方法
May 24 Python
python 中的jieba分词库
Nov 23 Python
使用python实现抓取腾讯视频所有电影的爬虫
Apr 15 #Python
Python 编程速成(推荐)
Apr 15 #Python
值得收藏的10道python 面试题
Apr 15 #Python
Python 学习教程之networkx
Apr 15 #Python
Python OS模块实例详解
Apr 15 #Python
Python日期时间Time模块实例详解
Apr 15 #Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 #Python
You might like
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
PHP 无限级分类
2017/05/04 PHP
php实现微信支付之退款功能
2018/05/30 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JavaScript手机振动API
2016/06/11 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
10款最好的Python开发编辑器
2019/07/03 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
会计工作决心书
2014/03/11 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
企业务虚会发言材料
2014/10/20 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
如何写观后感
2015/06/19 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
使用Python获取字典键对应值的方法
2022/04/26 Python