最近在看python網絡編程,分享點內容。
0x00 SimpleServer
#-*-coding:utf-8-*- # Simple Server - Chapter 1 - SimpleServer_makefile.py import socket host = '' port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) s.listen(1) print "Server is running on port %d; press Ctrl-C to terminate." % port while 1: clientsock, clientaddr = s.accept() clientfile = clientsock.makefile('rw', 0) clientfile.write("Welcome, " + str(clientaddr) + "\n") clientfile.write("Please enter a string: ") line = clientfile.readline().strip() clientfile.write("You enterd %d characters.\n" % len(line)) clientfile.close() clientsock.close()
0x01 簡單解析
第1步是創建socket對象
socket=socket.socket(familly,type)
family的值可以是AF_UNIX(Unix域,用於同一臺機器上的進程間通訊),也可以是AF_INET(對於IPV4協議的TCP和 UDP),至於type參數,SOCK_STREAM(流套接字,tcp)或者 SOCK_DGRAM(數據報文套接字,udp),SOCK_RAW(raw套接字)
第2步則是將socket綁定(指派)到指定地址
socket.bind(address)
address必須是一個雙元素元組((host,port)),主機名或者ip地址+端口號。如果端口號正在被使用或者保留,或者主機名或ip地址錯誤,則引發socke.error異常。
第3步,啓動接收連接請求
socket.listen( backlog )
開始監聽TCP傳入連接。backlog指定在拒絕連接之前,操作系統可以掛起的最大連接數量。該值至少爲1,大部分應用程序設爲5就可以了。
第4步是通過socket的accept方法等待客戶請求一個連接
調用accept方法時,socket會時入“waiting”狀態。客戶請求連接時,方法建立連接並返回服務器。accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,服務器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
第5步是處理階段,服務器和客戶端通過send和recv方法通信(傳輸 數據),上例採用的是makefile,makefile一個與該套接字相關連的文件。
0x02 socket-server-client
服務器端:
#-*-coding:utf-8-*- import socket #socket模塊 import os #執行系統命令模塊 HOST='' PORT=51423 s= socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定義socket類型,網絡通信,TCP s.bind((HOST,PORT)) #套接字綁定的IP與端口 s.listen(1) #開始TCP監聽 while 1: conn,addr=s.accept() #接受TCP連接,並返回新的套接字與IP地址 print'Connected by',addr #輸出客戶端的IP地址 while 1: data=conn.recv(1024) #把接收的數據實例化 instr=os.popen(data).readlines() result = "" for line in instr: result += line conn.send(result) conn.close() #關閉連接
客戶端:
#-*-coding:utf-8-*- import socket HOST='127.0.0.1' PORT=51423 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定義socket類型,網絡通信,TCP s.connect((HOST,PORT)) #要連接的IP與端口 while 1: cmd=raw_input("Please input cmd:") #與人交互,輸入命令 s.sendall(cmd) #把命令發送給對端 data=s.recv(1024) #把接收的數據定義爲變量 print data #輸出變量 s.close() #關閉連接以上代碼實現了客戶端與服務器端的簡單交互,使用了os模塊來執行命令,若是在linux環境下,直接使用commands模塊就行。