摘要:服務器端先啟動后,循環等待客戶端訪問。使用時,要使用網絡協議搜索主機也可以使用和本地非網絡的套接字,但是很明顯此時并沒有使用使用方式時,要使用基于流套接字創建套接字,必須使用作為套接字類型。
問題
在windows環境主機A上想每隔15分鐘獲取遠程Linux主機B上定時監控的logFile文件,但通過在A主機上:telnet B"ip port (例:telnet 158.123.12.1 21)查看遠程主機沒開放21、22端口,好像不能使用ftp或者sftp來獲取(應該是不可以吧)。想自己寫個簡單服務器實現:
1、服務器端能夠正確讀取logFile內容
2、客戶端訪問時,服務器端能夠返回logFile的內容
2、客戶端能夠正確獲取logFile內容并寫入本地文件中
使用Python的socket模塊,自己新增一個可以直接訪問的PORT。為了保證數據準確性,使用比較簡單的方法:客戶端與服務器端通過TCP方式通信。服務器端先啟動后,循環等待客戶端訪問。由于是單個客戶端每隔15分鐘訪問,每完成一次訪問便斷開連接,所以采用了單線程阻塞的方法實現的服務器端:
#coding=utf-8 #!/usr/bin/python from socket import * HOST = "158.123.12.1" PORT = 8083 BUFSIZE = 65535 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) welcomeStr = "Welcome to 12.1 python socket server" def logFileRead(logFile): """ Read logFile by line return List """ logFileDealList = [] with open(logFile, "r") as logFileContent: for line in logFileContent.readlines(): logFileDealList.append(line) return logFileDealList if __name__ == "__main__": fileDir = "filePath/warningMessage.txt" while True: print "Enter 12.1 python socket server" tcpCliSock, addr = tcpSerSock.accept() print "Connected from : ", addr data = tcpCliSock.recv(BUFSIZE) if not data: break print data logFileContentList = logFileRead(fileDir) # print logFileContentList for fileContent in logFileContentList: if fileContent.find("pending") == -1: continue tcpCliSock.send("%s" % fileContent) tcpCliSock.close() tcpSerSock.close()
ADDR 中PORT為int類型,要選取不沖突的PORT,在Linux上可以通過netstat -anp | grep PORT"id 例:netstat -anp | grep 8083,查看端口號占用情況。
socket(AF_INET, SOCK_STREAM):使用HOST+PORT時,要使用AF_INET網絡協議搜索主機(也可以使用 TCP 和本地[非網絡的 AF_LOCAL/AF_UNIX]套接字,但是很明顯此時并沒有使用 IP);使用TCP方式時,要使用SOCK_STREAM基于流套接字(創建 UDP 套接字,必須使用SOCK_DGRAM作為套接字類型)。
bind(ADDR):將地址(主機名、端口號對)綁定到套接字上
listen(5):設置并啟動TCP監聽器,參數5是在連接被轉接或拒絕之前,傳入連接請求的最大數連接隊列最大值。如果Client端請求超過5個,Linux中Server會延遲到連接數低于5時響應連接。未測試過,具體處理流程可以參考:TCP握手與socket通信細節。由于當前只有一個Client客戶端,所以5足夠使用。
def logFileRead(logFile):讀取文件的function
accept():被動接受TCP客戶端連接,持續等待直到連接到達(阻塞等待)
tcpCliSock.recv(BUFSIZE):接收TCP消息,BUFSIZE定義的為緩沖區大小。接收的是Client端傳送過來的消息。
tcpCliSock.send("%s" % fileContent):發送TCP消息,將結果返回給Client段
tcpCliSock.close():關閉客戶端連接
tcpSerSock.close():退出服務器端
執行時,可以將Server端掛載到后臺不退出
#coding=utf-8 #!/usr/bin/python from socket import * HOST = "158.123.12.1" PORT = 8083 BUFSIZE = 65535 ADDR = (HOST, PORT) welcomeStr = "Welcome to 12.1 python socket server" def fileWrite(record, fileName): with open(fileName, "w") as logFile: for recordItem in record: logFile.write(recordItem) def main(): tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) fileDir = "filePath/warnLogFile.txt" print "Will connect 12.1 python socket server" data = "hello" tcpCliSock.send(data) retDataAll = "" while True: retDataTmp = tcpCliSock.recv(BUFSIZE) if not retDataTmp: break if not len(retDataTmp): break print retDataTmp retDataAll = retDataAll + retDataTmp print "end " tcpCliSock.close() fileWrite(retDataAll, fileDir) if __name__ == "__main__": main()
ADDR = (HOST, PORT):與Server端HOST、PROT相同
def fileWrite(record, fileName):覆蓋寫入文件,注意如果該文件不存在會報錯
tcpCliSock.send(data):發送消息給服務器端
tcpCliSock.recv(BUFSIZE):注意接收服務器端返回消息時,有可能超過BUFSIZE或者超過了MTU等限制,單次獲取的記錄不完整。所以使用TCP協議時,通過循環判斷是否存在待接收消息,直到無消息時才斷開連接
參考文章Python核心編程(第3版)
TCP握手與socket通信細節
Python中使用socket發送HTTP請求數據接收不完整問題解決方法
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40924.html
摘要:套接字有兩種或者稱為有兩個種族分別是基于文件型的和基于網絡型的。大部分網絡設備的都是。不會發生黏包,用戶數據報協議是無連接的,面向消息的,提供高效率服務。即面向消息的通信是有消息保護邊界的。 軟件開發的架構 我們了解的涉及到兩個程序之間通訊的應用大致可以分為兩種: 第一種是應用類:qq、微信、網盤、優酷這一類是屬于需要安裝的桌面應用 第二種是web類:比如百度、知乎、博客園等使用瀏覽器...
摘要:在任何類型的通信開始之前,網絡應用程序必須創建套接字。基于文件的套接字,家族名又名基于網絡的套接字,家族名在和后續的版本中,支持的套接字有,,,。中的網絡編程在中主要是用模塊來實現基于套接字的網絡通信。 python學習記錄--網絡編程 1、套接字介紹 一臺機器上的不同進程之間進行通信可以利用隊列,管道等,但是不同機器之間的進程進行通信用隊列是不行的,解決這個問題就是網絡套接字。 套接...
摘要:當一個客戶端連接時,它將返回一個新的對象,對象中有表示當前連接的和一個由主機端口號組成的連接的元組,更多關于元組值的內容可以查看地址族一節中的詳情這里必須要明白我們通過調用方法擁有了一個新的對象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 說明 本書翻譯自 realpython 網站上的文章教程 ...
閱讀 988·2021-11-23 09:51
閱讀 2700·2021-08-23 09:44
閱讀 662·2019-08-30 15:54
閱讀 1437·2019-08-30 13:53
閱讀 3109·2019-08-29 16:54
閱讀 2529·2019-08-29 16:26
閱讀 1194·2019-08-29 13:04
閱讀 2317·2019-08-26 13:50