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

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

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

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

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

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

import socket

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

例子中創(chuàng)建了一個(gè)TCP socket,socket.socket函數(shù)的前兩個(gè)參數(shù)的默認(rèn)值是socket.AF_INET和socket.SOCK_STREAM,創(chuàng)建TCP socket時(shí)可以直接寫成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ù)有兩個(gè)方法send和sendall,send不能保證所有的數(shù)據(jù)都發(fā)送完了,它會(huì)返回已發(fā)送數(shù)據(jù)的長(zhǎng)度,程序要循環(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)了錯(cuò)誤,它實(shí)際上也是循環(huán)發(fā)送數(shù)據(jù)直到所有數(shù)據(jù)發(fā)送完成。

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

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ā)生了異常。

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

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

data = s.recv(4096)

在Python 3中返回的是bytes對(duì)象,在Python 2中返回的是string。注意函數(shù)返回的數(shù)據(jù)長(zhǎng)度是小于或者等于參數(shù)指定的長(zhǎng)度的,要接收到指定長(zhǎng)度的數(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)閉連接

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

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

一個(gè)簡(jiǎ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()

錯(cuò)誤處理

socket處理過程中發(fā)生錯(cuò)誤會(huì)拋出異常,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密碼錯(cuò)誤三次鎖定(實(shí)例講解)

    python密碼錯(cuò)誤三次鎖定(實(shí)例講解)

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

    Python視頻編輯庫(kù)MoviePy的使用

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

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

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

    python正則表達(dá)式用法超詳細(xì)講解大全

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

    Python采集貓眼兩萬(wàn)條數(shù)據(jù) 對(duì)《無(wú)名之輩》影評(píng)進(jìn)行分析

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

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

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

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

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

    Python中reduce函數(shù)詳解

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

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

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

    PIL對(duì)上傳到Django的圖片進(jìn)行處理并保存的實(shí)例

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

最新評(píng)論

盐亭县| 于都县| 远安县| 佛冈县| 鄂托克旗| 双牌县| 昌江| 鲁甸县| 马公市| 海淀区| 隆化县| 儋州市| 连南| 柯坪县| 微山县| 崇文区| 乐平市| 墨江| 莱州市| 丘北县| 读书| 固阳县| 台前县| 皮山县| 公主岭市| 山东省| 阜新市| 疏勒县| 玛曲县| 横峰县| 禹城市| 凌源市| 自贡市| 宜春市| 丹江口市| 项城市| 保德县| 星子县| 龙海市| 招远市| 浦江县|