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中的Descriptor描述符类
Jun 14 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
Python编程之event对象的用法实例分析
Mar 23 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
python使用turtle绘制分形树
Jun 22 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
python 并发下载器实现方法示例
Nov 22 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Numpy 理解ndarray对象的示例代码
Apr 03 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
浅析php学习的路线图
2013/07/10 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
python局部赋值的规则
2013/03/07 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
tensorflow多维张量计算实例
2020/02/11 Python
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
活动志愿者自荐信
2014/01/27 职场文书
学校联谊活动方案
2014/02/15 职场文书
现金出纳岗位职责
2014/03/15 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
领导班子四风表现材料
2014/08/23 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL