最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最基礎(chǔ)的Python的socket編程入門教程

 更新時間:2015年04月23日 14:39:49   作者:愚安  
這篇文章主要介紹了最基礎(chǔ)的Python的socket編程入門教程,包括最基本的發(fā)送和接受信息等內(nèi)容,需要的朋友可以參考下

本文介紹使用Python進行Socket網(wǎng)絡(luò)編程,假設(shè)讀者已經(jīng)具備了基本的網(wǎng)絡(luò)編程知識和Python的基本語法知識,本文中的代碼如果沒有說明則都是運行在Python 3.4下。

Python的socket功能封裝在socket庫中,要使用socket,記得先import socket,socket庫的詳細介紹參見官方文檔。
創(chuàng)建Socket

首先創(chuàng)建一個socket,使用socket庫中得socket函數(shù)創(chuàng)建。

import socket

# create an INET, STREAM socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

例子中創(chuàng)建了一個TCP socket,socket.socket函數(shù)的前兩個參數(shù)的默認值是socket.AF_INET和socket.SOCK_STREAM,創(chuàng)建TCP socket時可以直接寫成socket.socket()。
連接服務(wù)器

使用socket的connect函數(shù)連接到服務(wù)器,以下幾種參數(shù)都是合法的。

s.connect(('localhost', 8000))
s.connect(('127.0.0.1', 8000))
s.connect(('www.baidu.com', 80))

發(fā)送數(shù)據(jù)

發(fā)送數(shù)據(jù)有兩個方法send和sendall,send不能保證所有的數(shù)據(jù)都發(fā)送完了,它會返回已發(fā)送數(shù)據(jù)的長度,程序要循環(huán)發(fā)送數(shù)據(jù)直到所有數(shù)據(jù)都已發(fā)送完畢。

def mysend(s, msg):
  total_len = len(msg)
  total_sent = 0
  while total_sent < total_len:
    sent = s.send(msg[total_sent:])
    if sent == 0:
      raise RuntimeError("socket connection broken")
    total_sent += sent

sendall能夠保證所有的數(shù)據(jù)都已發(fā)送完畢,除非發(fā)送過程中出現(xiàn)了錯誤,它實際上也是循環(huán)發(fā)送數(shù)據(jù)直到所有數(shù)據(jù)發(fā)送完成。

這里還要講一個需要特別注意的地方,從一個例子開始吧:

import socket
s = socket.socket()
s.connect(('www.baidu.com', 80))
s.sendall('test')

都是上面講過的東西,沒什么特別的,分別在Python 2和Python 3中執(zhí)行以上的代碼,結(jié)果是:

# Python 2.7
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')

Python 2中執(zhí)行成功。

# Python 3.4
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

Python 3中卻發(fā)生了異常。

同樣的代碼換個環(huán)境卻不能執(zhí)行了,我沒有寫錯呀,怒砸電腦。好吧,你確實沒寫錯,是環(huán)境變了,導(dǎo)致這個結(jié)果的變化請移步官方的說明。
接收數(shù)據(jù)

使用recv函數(shù)接收數(shù)據(jù):

data = s.recv(4096)

在Python 3中返回的是bytes對象,在Python 2中返回的是string。注意函數(shù)返回的數(shù)據(jù)長度是小于或者等于參數(shù)指定的長度的,要接收到指定長度的數(shù)據(jù),需要循環(huán)接收數(shù)據(jù)。

def myreceive(s, msglen):
  chunks = []
  bytes_recd = 0
  while bytes_recd < msglen:
    chunk = s.recv(min(msglen - bytes_recd, 2048))
    if chunk == b'':
      raise RuntimeError("socket connection broken")
    chunks.append(chunk)
    bytes_recd = bytes_recd + len(chunk)
  return b''.join(chunks)

關(guān)閉連接

當連接不再需要時可以使用close關(guān)閉socket連接,關(guān)閉后的連接不能再進行任何操作。當一個socket被回收時會自動關(guān)閉,但是不要依賴這種機制,不需要socket時就主動的close。
服務(wù)端

服務(wù)端程序執(zhí)行的步驟:
1. 創(chuàng)建服務(wù)端socket
1. 將服務(wù)端socket綁定到指定的地址和端口
1. 監(jiān)聽連接
1. 接受客戶端連接
1. 處理客戶端的數(shù)據(jù)
1. 關(guān)閉客戶端連接

一個簡單的echo server示例:

import socket

HOST = ''
PORT = 10022

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
conn, addr = s.accept()
while True:
  data = conn.recv(1024)
  if not data:
    break
  conn.sendall(data)
conn.close()

客戶端程序:

import socket

HOST = 'localhost'
PORT = 10022

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'hello socket')
data = s.recv(1024)
print('Received', repr(data))
s.close()

錯誤處理

socket處理過程中發(fā)生錯誤會拋出異常,socket相關(guān)的異常有:

  • - socket.error
  • - socket.herror
  • - socket.gaierror
  • - socket.timeout
import socket

HOST = None
PORT = 10022

try:
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.bind((HOST, PORT))
  s.listen(10)
except: socket.error as msg:
  print(msg)

相關(guān)文章

  • python密碼錯誤三次鎖定(實例講解)

    python密碼錯誤三次鎖定(實例講解)

    下面小編就為大家分享一篇python密碼錯誤三次鎖定的實例講解。具有很好的參考價值。希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • Python視頻編輯庫MoviePy的使用

    Python視頻編輯庫MoviePy的使用

    這篇文章主要介紹了Python視頻編輯庫MoviePy的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python根據(jù)用戶需求輸入想爬取的內(nèi)容及頁數(shù)爬取圖片方法詳解

    python根據(jù)用戶需求輸入想爬取的內(nèi)容及頁數(shù)爬取圖片方法詳解

    這篇文章主要介紹了python根據(jù)用戶需求輸入想爬取的內(nèi)容及頁數(shù)爬取圖片方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • python正則表達式用法超詳細講解大全

    python正則表達式用法超詳細講解大全

    正則表達式是一種用來匹配字符串的強有力的武器,利用字符來匹配字符的思想,基于顯示規(guī)則進行模式匹配,可以高效組合成不同樣式的字符串,下面這篇文章主要給大家介紹了關(guān)于python正則表達式用法超詳細講解的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Python采集貓眼兩萬條數(shù)據(jù) 對《無名之輩》影評進行分析

    Python采集貓眼兩萬條數(shù)據(jù) 對《無名之輩》影評進行分析

    這篇文章主要給大家介紹了關(guān)于利用Python榮國采集兩萬條貓眼數(shù)據(jù),對《無名之輩》影評進行分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python+Django實現(xiàn)接口測試工具的示例代嗎

    Python+Django實現(xiàn)接口測試工具的示例代嗎

    本文主要介紹了Python+Django實現(xiàn)接口測試工具,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 基于Python實現(xiàn)圖像文字識別OCR工具

    基于Python實現(xiàn)圖像文字識別OCR工具

    在工作、生活中常常會用到,比如票據(jù)、漫畫、掃描件、照片的文本提取。本文主要介紹了基于PyQt + PaddleOCR實現(xiàn)的一個桌面端的OCR工具,用于快速實現(xiàn)圖片中文本區(qū)域自動檢測+文本自動識別,需要的朋友可以參考一下
    2021-12-12
  • Python中reduce函數(shù)詳解

    Python中reduce函數(shù)詳解

    本文主要介紹了Python中reduce函數(shù)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python虛擬環(huán)境venv的使用方法

    Python虛擬環(huán)境venv的使用方法

    venv 是 Python 里的一個標準工具,它的主要功能是幫助用戶管理和控制虛擬環(huán)境,venv 的使用方法其實非常簡單,下面我將詳細介紹如何創(chuàng)建虛擬環(huán)境,如何激活虛擬環(huán)境,以及如何退出虛擬環(huán)境的操作步驟,需要的朋友可以參考下
    2024-03-03
  • PIL對上傳到Django的圖片進行處理并保存的實例

    PIL對上傳到Django的圖片進行處理并保存的實例

    今天小編就為大家分享一篇PIL對上傳到Django的圖片進行處理并保存的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

新巴尔虎右旗| 林周县| 蓬溪县| 湘西| 武宣县| 宝丰县| 台东县| 榆中县| 阿鲁科尔沁旗| 阿鲁科尔沁旗| 思茅市| 克什克腾旗| 贡山| 永州市| 景泰县| 临漳县| 托克托县| 万盛区| 彩票| 皋兰县| 宣汉县| 县级市| 西和县| 临漳县| 天峨县| 上犹县| 新河县| 定边县| 昆明市| 沛县| 台南县| 东乡族自治县| 磴口县| 江孜县| 宜黄县| 东丰县| 新化县| 乳源| 额济纳旗| 夹江县| 高雄县|