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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
python快排算法详解
Mar 04 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python实现控制台输出彩色字体
Apr 05 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 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如何解决无法上传大于8M的文件问题
2014/03/10 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
wxPython窗口的继承机制实例分析
2014/09/28 Python
python杀死一个线程的方法
2015/09/06 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python之array赋值技巧分享
2019/11/28 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
动物科学专业求职信
2014/07/27 职场文书
2015年派出所工作总结
2015/04/24 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
七年级作文之下雨天
2019/12/23 职场文书
python中tkinter复选框使用操作
2021/11/11 Python