Socket in Python
之前就稍微學過c的socket program, 最近剛好再接觸python,也就順道一起研究
這次會介紹透過ip互相溝通與process間互相溝通的兩種寫法(寫法幾乎相同 只差在參數的調用部分)
1.透過ip互相溝通:
Server code:
註1:AF_INET表示使用internet來進行傳輸,SOCK_STREAM表示使用TCP協定
註2:將socket綁定到指定的HOST和PORT
註3:設定server的隊列大小
註4:等待client連接
註5:設定timeout時間為10秒
註6:接收command的最大size為1024byte
註7:送字串傳去client
Client code:
send和sendall 的差別:
send: 最後會回傳總共傳送了多少byte,如果只有一些字元被傳送,application會繼續負責把剩餘的資料傳完。
sendall: 這個函數會負責把文字傳送到另一端,但如果沒傳送完全會跳excepcttion,且沒辦法知道總共傳送了多少字元,回傳0
是代表傳送成功。
2.process間互相溝通:
Server code:
Client code:
#註8: AF_UNIX 是用於同一台電腦中process與process互相溝通時所調用的參數
#註9: 這邊會把HOST和PORT轉換成指定到電腦上的某一個檔案 所以要保證此檔案不存在 不然會發生錯誤
總結:
python程式比起c來說真的是好寫太多,c要用近百行的程式碼來寫socket,而python只需十幾行,真的很簡單,但是python是沒有multi-thread的,所以在loading重的情況下,容易造成lag,要改成multi-process。
這次會介紹透過ip互相溝通與process間互相溝通的兩種寫法(寫法幾乎相同 只差在參數的調用部分)
1.透過ip互相溝通:
Server code:
#!/usr/bin/pythonimport socket,os
HOST = '' PORT = 5566
if __name__ == '__main__': s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #註1 s.bind((HOST, PORT)) #註2 s.listen(5) #註3 while(1): conn, addr = s.accept() #註4 print 'Connected by', addr try: conn.settimeout(10) #註5 data = conn.recv(1024) #註6 if not data: print 'Error' conn.send('Error') elif data =='exit': conn.send('bye') break else: print "======start=====" os.system(data) conn.send('Executed '+data) #註7 except socket.timeout: print 'time out' conn.close()
註1:AF_INET表示使用internet來進行傳輸,SOCK_STREAM表示使用TCP協定
註2:將socket綁定到指定的HOST和PORT
註3:設定server的隊列大小
註4:等待client連接
註5:設定timeout時間為10秒
註6:接收command的最大size為1024byte
註7:送字串傳去client
Client code:
#!/usr/bin/python
import socket,sys
if __name__ == '__main__':
if len(sys.argv) < 3: print 'please check the insertion' elif sys.argv[2].strip() == '': print 'please check the command' else: HOST = sys.argv[1] PORT = 5566
s = socket.socket(socket.AF_INET,
socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(sys.argv[2]) data = s.recv(1024) s.close() print 'Received', repr(data)
send和sendall 的差別:
send: 最後會回傳總共傳送了多少byte,如果只有一些字元被傳送,application會繼續負責把剩餘的資料傳完。
sendall: 這個函數會負責把文字傳送到另一端,但如果沒傳送完全會跳excepcttion,且沒辦法知道總共傳送了多少字元,回傳0
是代表傳送成功。
2.process間互相溝通:
Server code:
#!/usr/bin/pythonimport socket,os,sys
if __name__ == '__main__': sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) #註8 if os.path.exists('/mnt/pc.d'): #註9 os.unlink('/mnt/pc.d') sock.bind('/mnt/pc.d') sock.listen(5) while True: conn, addr = sock.accept() data = conn.recv(1024) os.system(data) conn.send('Execute '+data) conn.close()
Client code:
#!/usr/bin/pythonimport socket,time,sys
if __name__ == '__main__': sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect("/mnt/pc.d") sock.send(sys.argv[1]) print sock.recv(1024) sock.close()
#註8: AF_UNIX 是用於同一台電腦中process與process互相溝通時所調用的參數
#註9: 這邊會把HOST和PORT轉換成指定到電腦上的某一個檔案 所以要保證此檔案不存在 不然會發生錯誤
總結:
python程式比起c來說真的是好寫太多,c要用近百行的程式碼來寫socket,而python只需十幾行,真的很簡單,但是python是沒有multi-thread的,所以在loading重的情況下,容易造成lag,要改成multi-process。