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中的FTP通信模块ftplib的用法整理
Jul 08 Python
Python数据结构之单链表详解
Sep 12 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
python实现梯度下降法
Mar 24 Python
pandas分组聚合详解
Apr 10 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
pytorch锁死在dataloader(训练时卡死)
May 28 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 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
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
php无限极分类实现方法分析
2019/07/04 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
Python中random模块用法实例分析
2015/05/19 Python
Python Requests 基础入门
2016/04/07 Python
python编程线性回归代码示例
2017/12/07 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python做接口测试的必要性
2019/11/20 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
机械工程及自动化专业求职信
2014/09/03 职场文书
创优争先心得体会
2014/09/11 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
领导视察通讯稿
2015/07/18 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers