Python Socket,How to Create Socket Cilent? - 網絡編程實例

文章出自: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的請求過程,經過上面的例子,能夠幫助你深入的理解這一過程。

相關文章
相關標籤/搜索