文章出自:Python socket – network programming tutorial by Silver Moonpython
原創譯文,若有版權問題請聯繫刪除。編程
Network programing in Python:瀏覽器
Part1: Programing sockets client.服務器
這是一篇在Python中Socket網絡編程的快速指南,實現過程很是接近於C語言。網絡
整體來講,在電腦網絡通訊完成的背後,Sockets是很是基礎的「事情」,好比說,當你在瀏覽器輸入"www.baidu.com", 實際上它須要先打開Socket而且鏈接到baidu.com 而後纔將結果呈現給你。和任何其餘的通信同樣,好比說:Gtalk 或 Skype,任何網絡通訊都是要經過Socket.socket
在本次的快速指南中,將要在Python中使用TCP Socket編程。固然你也能夠在Python中使用UDP Socket編程,具體參考:program udp sockets in python.ide
Before you begain:網站
這篇教程開始以前,假設全部讀者都已經具有了Python的基礎編程知識。this
So, Let's do this.spa
Creating a Socket:
首先,咱們先建立一個Socket,而後socket.socket方法就有了這樣的功能:
例如:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #Socket client example in python import socket #for sockets #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print ('Socket Created')
方法 socket.socket 建立了一個socket 並返回一個socket能夠用於和其餘socket相關的描述。
上面的代碼將會建立一個socket,擁有了下面的屬性...
Address Family : AF_INET (this is IP version 4 or IPv4)
Type : SOCK_STREAM (this means connection oriented TCP protocol)
Error Handling:
若是任何socket方法異常或失敗,Python將會拋出一個異常而後調用socket.error。
#handling errors in python socket programs import socket #for sockets import sys #for exit try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error as msg: print ('Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]) sys.exit(); print ('Socket Created')
OK, so 你已經成功建立了一個socket,接下來咱們將會嘗試鏈接一個server,固然咱們能夠鏈接www.baidu.com。
Connect to a Server:
咱們經過已知的端口鏈接遠程服務器,有2件事是必備的,其中分別是IP地址和端口號,因此你在創建遠程鏈接以前必須知道IP地址和端口號,在這裏咱們使用www.baidu.com做爲鏈接的服務器。
a>.首先,獲取遠程服務器或鏈接的IP地址
在開始connect以前,必須獲取IP地址,在Python中獲取IP地址須要一句很簡單的代碼。
#!/usr/bin/python import socket #for sockets import sys #for exit try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #except socket.error,msg, error msg: ", variable" not allowed in 3.x - use "as variable" instead. except socket.error as msg: print ('Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]) sys.exit(); print ('Socket Created') host = 'www.baidu.com' try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print ('Hostname could not be resolved. Exiting') sys.exit() print ('Ip address of ' + host + ' is ' + remote_ip)
b>.如今咱們已經獲得遠程服務器或系統的IP地址,可使用connect方法和端口建立鏈接。
實例:
#!/usr/bin/python import socket #for sockets import sys #for exit try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #except socket.error,msg, error msg: ", variable" not allowed in 3.x - use "as variable" instead. except socket.error as msg: print ('Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]) sys.exit(); print ('Socket Created') host = 'www.baidu.com' port = 80 try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print ('Hostname could not be resolved. Exiting') sys.exit() print ('Ip address of ' + host + ' is ' + remote_ip) #connect to remote server s.connect((remote_ip,port)) print ('Socket connect ' + host + ' on ip ' + remote_ip)
結果視圖:
OK,如今咱們建立了一個Socket實例而且也已經成功鏈接了,固然你也能夠嘗試鏈接不一樣的端口(PORT),可是你會發現鏈接是失敗的,由於其餘的端口並非公開的,依據這樣的邏輯,你能夠作一個端口掃描器。
接下來咱們能夠嘗試發送一些數據到遠程服務器。
Sending Data:
方法:sendall 被用來發送數據,咱們來嘗試發送數據到baidu.com吧。
#!/usr/bin/python import socket #for sockets import sys #for exit import array try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #except socket.error,msg, error msg: ", variable" not allowed in 3.x - use "as variable" instead. except socket.error as msg: print ('Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]) sys.exit(); print ('Socket Created') host = 'www.baidu.com' port = 80 try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print ('Hostname could not be resolved. Exiting') sys.exit() print ('Ip address of ' + host + ' is ' + remote_ip) #connect to remote server s.connect((remote_ip,port)) print ('Socket connect ' + host + ' on ip ' + remote_ip) #sending some data to romete server #socket sending must be bytes message = b"GET / HTTP/1.1\r\n\r\n" try: #sending message s.sendall(message) except socket.error: #Send failed print('Send failed') sys.exit(); print('Sending data successfully')
在上面的例子中,咱們首先鏈接到遠程服務器而且發送了bytes字節的message(b"GET / HTTP/1.1\r\n\r\n"),信息其實是以「http command」訪問網站的。如今咱們已經發送了一些數據,如今該是時機接收數據了。
Receiving Data:
在Python的socket中,方法「recv」是用來接收返回數據的,下面的例子將會展現接收從遠程服務器返回的數據。
實例:
#!/usr/bin/python import socket #for sockets import sys #for exit import array try: #create an AF_INET, STREAM socket (TCP) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #except socket.error,msg, error msg: ", variable" not allowed in 3.x - use "as variable" instead. except socket.error as msg: print ('Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]) sys.exit(); print ('Socket Created') host = 'www.baidu.com' port = 80 try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print ('Hostname could not be resolved. Exiting') sys.exit() print ('Ip address of ' + host + ' is ' + remote_ip) #connect to remote server s.connect((remote_ip,port)) print ('Socket connect ' + host + ' on ip ' + remote_ip) #sending some data to romete server #socket sending must be bytes message = b"GET / HTTP/1.1\r\n\r\n" try: #sending message s.sendall(message) except socket.error: #Send failed print('Send failed') sys.exit(); print('Sending data successfully') #receiving data reply = s.recv(1024) print( reply,'We got some datas as :', end='\n')
結果:
咱們能夠看到,www.baidu.com迴應了咱們的請求,如今咱們已經成功的接收到迴應,是時候關閉咱們的socket了。
Close Socket:
方法: close 用來關閉socket。
s.close()
that's it! 原文做者好傲嬌。
Summary:
經過上面的例子,咱們掌握了:
1>.在Python中如何建立一個Socket.
2>.鏈接到遠程服務器
3>.發送數據
4>.接收數據
對於瀏覽器打開www.baidu.com的請求過程,經過上面的例子,能夠幫助你深入的理解這一過程。