python網絡編程之SimpleServer/Client

最近在看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模塊就行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章