python运维开发之第八天(socket)

什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])

参数

  • family: 套接字家族可以使AF_UNIX或者AF_INET 地址簇
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM 即tcp/ip和udp 
  • protocol: 一般不填默认为0.

Socket 对象(内建)方法

函数描述
服务器端套接字
s.bind()绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen()开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端套接字
s.connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall()完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvform()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
s.makefile()创建一个与该套接字相关连的文件

简单实例

服务端

我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Willpower-chen
# @blog: http://www.cnblogs.com/willpower-chen/

import socket,os,time    #导入socket和os模块#实例化,AF_INET地址簇ipv4协议,SOCK_STREAM这是TCP/IP协议
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('0.0.0.0',9999))    #绑定地址及服务端口
server.listen(5)                        #限制连接数
while True:                        #当一个client端断开时,接收下一个客户端# 每个客户端发送过来的数据,生成相应的实例conn,client端连接地址addrconn,addr = server.accept()print('新的连接:',addr)while True:print('等待新的指令')data = conn.recv(1024)    #接收client端发来的数据if not data:print('客户端已断开')break        #当数据为空时,跳出循环等待下一个连接print('执行指令',data.decode())    #打印要执行的命令cmd_res = os.popen(data.decode()).read()#返回client发过来的cmd命令,在server端的执行结果#由于每次接收数据的大小为1024,为了确定client需要接收几次,所以需要先把总数据大小发给clientprint('开始发送',len(cmd_res))if len(cmd_res) == 0 :     #如果cmd执行结果为空时,server端不会发送数据cmd_res = 'cmd_res is not info'    #为了防止为空时不发数据,自定义一个数据print('执行命令结果大小:',len(cmd_res))#打印命令执行结果数据大小conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))    #给client发送数据总大小信息#time.sleep(0.5)client_ack = conn.recv(1024)    #等待client端确认ack,防止粘包print('ack from client',client_ack.decode('utf-8'))    #打印ack确认信息conn.send(cmd_res.encode('utf-8'))    #给client发送命令执行结果数据print('发送完毕')
server.close()

客户端

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 9999。

socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端后期数据,记住,操作完成后需要关闭连接。

完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Willpower-chen
# @blog: http://www.cnblogs.com/willpower-chen/
import socketclient = socket.socket() #默认地址簇是ipv4,传输协议是TCP/IP
client.connect(('localhost',9999))#与server建立连接
while True:cmd = input('>>:').strip()  # 用户输入cmd命令if len(cmd) == 0: continue #如果用户输入为空,循环输入client.send(cmd.encode('utf-8'))#发送cmd命令,encode是把字符串转为byte(python3.0传输只能是二进制)cmd_res_size = client.recv(1024)#确认接收命令结果的长度print('命令结果大小',cmd_res_size.decode())    #打印命令结果的长度client.send('准备好接收了,loser可以发了'.encode('utf-8'))#ack确认,防止粘包,注意这里不能用b''因为加中文了receive_size = 0    #已经接收的数据,默认先设置为0receive_data = ''.encode()while receive_size < int(cmd_res_size.decode()): #已接收数据小于总数据时,循环接收数据data = client.recv(1024)receive_size += len(data) #每次收到的有可能小于1024,所以用len(data)计算receive_data += dataelse:print('cmd res receive done...',receive_size)print(receive_data.decode('utf-8'))
client.close()

ftp实例:

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Willpower-chen
# @blog: http://www.cnblogs.com/willpower-chen/

import os,hashlib,socketserver = socket.socket()
server.bind(('0.0.0.0',9999))
server.listen(5)
while True:conn,addr = server.accept()    #客户端实例成conn,客户端连接地址为addrprint('客户端已经断开,开始新的连接,客户端连接地址为:',addr)while True:cmd = conn.recv(1024)    #客户端发出的命令if len(cmd) == 0: break #如果接收到的命令为空,断开连接,等待新的连接# cmd_res = os.popen(cmd.decode('utf-8')).read()    #server端根据cmd命令,获取结果filename = cmd.decode().split()[1]    #获取文件名if os.path.isfile(filename):file_total_size = os.stat(filename).st_size    #获取文件大小,得到的数据类型是intm = hashlib.md5()  # 打开md5哈希conn.send(str(file_total_size).encode('utf-8'))    #发送总文件大小,conn.recv(1024)            #接收client端确认,防止粘包f = open(filename,'rb')#只读二进制方式打开文件,文件句柄为ffor line in f:m.update(line)        #md5逐行加密conn.send(line)        #逐行发送数据,由于之前打开方式是rb,所以这里不用encondeserver_file_md5 = m.hexdigest()    #服务端文件md5哈希值conn.send(server_file_md5.encode('utf-8'))    #发送服务端文件md5哈希值f.close()    #关闭文件
server.close()

client端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : Willpower-chen
# @blog: http://www.cnblogs.com/willpower-chen/

import socket,hashlibclient = socket.socket()
client.connect(('localhost',9999))
while True:data = input('>>:').strip()    #输入命令行if len(data)==0:continue        #如果输入是空,返回上层,重新输入cmd,filename = data.split()        #获取命令和文件名if len(filename)==0:continue    #r如果没有文件名,返回三层,重新输入if data.startswith('get'):            #判断如果是get命令是,继续以下操作client.send(data.encode('utf-8'))#发送命令行file_total_size = int(client.recv(1024).decode())    #获取文件大小信息,文件大小转换成int格式client.send('ack 确认'.encode())    #ack确认,防止粘包m = hashlib.md5()                    #启用md5哈希加密receive_size = 0                    #定义一个接收数据初始值为0f = open(filename+'new.txt','wb')                #打开一个文件,存储接收的文件数据# 如果接收的数据小于中大小,循环接收数据while receive_size < file_total_size:# 如果剩余数据的大于1024,定义下次接收数据大小为size,且大小是1024if file_total_size - receive_size > 1024:size = 1024# 如果剩余数据的小于等于1024,定义下次接收数据大小为size,大小是总大小减去已经接收的数据else:size = file_total_size - receive_sizefile_recv = client.recv(size)    #接收文件数据# receive_size +=size                #每接收一次数据,接收数据大小累计加一次receive_size +=len(file_recv)            #每接收一次数据,接收数据大小累计加一次m.update(file_recv)  # 每接收一次数据,做一次md5加密f.write(file_recv)                #每接收一次数据,往文件里写入一次else:print('接收完毕,要接收的文件总大小是%s ,已经接收的总数据是%s'%(file_total_size,receive_size))f.close()server_file_md5 = client.recv(1024)    #接收server端文件md5值client_file_md5 = m.hexdigest()        #客户端文件md5值print('server_file_md5',server_file_md5.decode())    #打印server端文件md5值print('client_file_md5',client_file_md5)            #打印client端文件md5值
client.close()

 

 

Python Internet 模块

以下列出了 Python 网络编程的一些重要模块:

协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib


参考网址:http://www.runoob.com/python/python-socket.html

 

转载于:https://www.cnblogs.com/willpower-chen/p/5867832.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Dubbo框架构建分布式服务

一、Dubbo服务集群容错 假设我们使用的是单机模式的Dubbo服务&#xff0c;如果在服务提供方&#xff08;Provider&#xff09;发布服务以后&#xff0c;服务消费方&#xff08;Consumer&#xff09;发出一次调用请求&#xff0c;恰好这次由于网络问题调用失败&#xff0c;那么我…

vue样式中背景图片路径_vue打包css文件中背景图片的路径问题

vue-cli写完的静态页面我们在node环境中引入没有问题&#xff0c;但是打包后放在Apache环境下&#xff0c;路径却有问题了如一个简单css语句.all_bg {background: url(../images/all_bg.png) 0 0 no-repeat;display: inline-block;overflow: hidden;background-size: 200px 300…

如果我们不曾相遇

五月天的演唱会定的是9月10号&#xff0c;周六晚上7点。 而我&#xff0c;差不多&#xff0c;从一周前就开始准备了&#xff0c;因为公司最近在赶工&#xff0c;特别忙。为了周末不加班我提前一周就旁敲侧击地询问师父的时间安排&#xff0c;最后又耿直地告诉师父我的周末计划&…

win下php的memcached的安装与使用

1、memcache的php扩展与memcached服务器的区别&#xff1f; php要操作memcached就必须要安装memcache的扩展&#xff0c; 在http://windows.php.net/downloads/pecl/releases/memcache/下载相应版本安装。 而php要操作memcached就必须要有memcached的服务&#xff0c;不然没有服…

git 常用命令笔记

#提交代码会加上用户名和邮箱 git config --global user.name 名字 git config --global user.email 邮箱 git config --global color.ui true#列出所有配置 git config --list#创建一个repository(仓库) git init #可以看到一个.git目录 ls -A #复制一个已有的项目 git clone …

mysql 表的存储类型_MySQL数据表存储引擎类型及特性

数据表类型(存储引擎)常见引擎比对 特点 Myisam InnoDB Memory BDB Archive 存储限制 无穷制 64TB 有 没有 没有 事务安然 - 支撑 - 支撑 - 锁机制 表锁 行锁 表锁 页锁 行锁 B树索引 支撑 支撑 支撑 支撑 - 哈希索引 - 支撑 支撑 - - 全文索引 支撑 - - - - 集群索引 - 支撑 -…

78.Subsets

Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example,If nums [1,2,3], a solution is: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]昨天中秋加上头非常痛&#xff0c;歇了一天…

python xyz_python中xyz坐标的欧几里德距离

使用生成器表达式的简单解决方案From PEP 289 Generator ExpressionsRationaleExperience with list comprehensions has shown their widespread utilitythroughout Python. However, many of the use cases do not need to have a full list created in memory. Instead, the…

[转载]SYSCALL_DEFINE宏定义

来源:http://blog.csdn.net/p_panyuch/article/details/5648007 SYSCALL_DEFINE3 在何处定义&#xff1f; #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) #define SYSCALL_DEFINEx(x, sname, ...) / _…

java连接数据库sql server_将SQL Server数据库连接到Java

我的项目没有使用任何IDE。整个编码使用Textpad完成。所以我需要帮助连接sql server数据库和我的项目。这是bean类&#xff0c;其中编写了用于数据库连接的业务逻辑。我已经安装了SQL服务器并使用Windows身份验证创建了一个名为“vt”的数据库。我甚至为数据库创建了dsn&#x…

ORM中的Model与DDD中的DomainModel

0.引言 在现有的系统开发中&#xff0c;大部分的系统应该都会用到ORM&#xff0c;无论用的是EF还是NHibernate。作为对象和持久化数据的桥梁&#xff0c;ORM确实非常方便&#xff0c;以至于在DDD的时候&#xff0c;我们很自然的将 ORM中的Model(实体)表达成DDD中的 DomainModel…

基础总结

Unsafe Java线程池 HashCode 垃圾收集 关于引用&#xff08;弱引用、强引用等等&#xff09;转载于:https://www.cnblogs.com/aquariusm/p/6340303.html

jsp java语法_JSP基础语法

Java JSP 的 JSP基础语法在本章中&#xff0c;我们将了解和学习JSP语法。并了解JSP开发涉及的简单语法(即元素)的基本用法。为了方便演示&#xff0c;使用Eclipse创建一个动态Web项目&#xff1a;jspsyntax&#xff0c;用于运行以下涉及到的示例代码。JSP的元素JSP的元素如下所…

iOS - Core Animation 核心动画

1、UIView 动画 具体讲解见 iOS - UIView 动画2、UIImageView 动画 具体讲解见 iOS - UIImageView 动画3、CADisplayLink 定时器 具体讲解见 iOS - OC NSTimer 定时器CADisplayLink 是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的…

navicat 官方使用手册,中文版,快捷键大全

2017年1月23日09:52:51 这个官方中文文档很详细 https://www.navicat.com.cn/manual/online_manual/cn/navicat/win_manual/index.html https://community.navicat.com/videos/cn 官方中文论坛部分视频教程 快捷键 Navicat 主窗口 键动作CTRLG设置位置文件夹CTRL#&#xff08;#…

Linux inode与文件系统关系

inode只有在linux文件系统的概念&#xff08;ext3,ext4) 、inode节点数量与文件存储的关系。 二、在文件系统初始化时设置合适的节点数量。 linux服务器在存储文件小而数量多的情况下&#xff0c;需要考虑inode用完的情况。转载于:https://www.cnblogs.com/lirunzhou/p/5883706…

评分系统 java_C自动评分系统

我无法按照规范完成作业 . 这是分配方案&#xff1a;大学迫切需要一个自动测试评分系统 . 使用C&#xff0c;为大学写一个评分系统&#xff0c;并对至少五名学生的测试进行评分 . 要创建评分系统&#xff0c;请按照以下步骤操作&#xff1a;首先询问测试中的问题数量然后询问每…

当Terraform遇上ECS(一)——DataSource篇

背景 越来越多的公司已经熟知并运用“基础设施即代码”来构建和维护自己的云基础设施。目前也有许多的自动化构建工具协助用户通过脚本进行云资源的部署和生命周期的管理&#xff0c;如&#xff1a;Terraform、Ansible、Chef等。但是&#xff0c;在实施过程中&#xff0c;都遇到…

【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322Description 农夫John准备扩大他的农场,他正在考虑N (1 < N < 50,000) 块长方形的土地. 每块土地的长宽满足(1 < 宽 < 1,000,000; 1 < 长 < 1,000,000). …

深入浅出学java_《深入浅出学JAVA开发初级》

整体说明&#xff1a;Java私塾的这一套视频是完全真实课堂录制&#xff0c;实际上课时间为十一天&#xff0c;主要内容包括&#xff1a;1&#xff1a;系统完整的学习Java的基础知识2&#xff1a;深入剖析重点知识点的理论3&#xff1a;超多的编程题目和程序讲解4&#xff1a;最…