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.pswp.cn/news/457272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457272.shtml
英文地址,請注明出處:http://en.pswp.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;最…