欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Socket編程詳解

 更新時間:2021年04月25日 10:41:47   作者:咸魚彬  
這篇文章主要介紹了Python Socket編程的相關資料,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下

背景

關于Python Socket編程,首先需要了解幾個計算機網絡的知識,通過以下的幾個問題,有助于更好的理解Socket編程的意義,以及整個框架方面的知識:

TCP和UDP協(xié)議本質上的區(qū)別?

TCP協(xié)議,面向連接,可靠,基于字節(jié)流的傳輸層通信協(xié)議;UDP協(xié)議無連接,不可靠,基于數據包的傳輸層協(xié)議。

TCP協(xié)議在建立連接的過程需要經歷三次握手,斷開連接則需要經歷四次揮手,而這建立連接的過程增加了傳輸過程中的安全性。
而建立連接的過程則會消耗系統(tǒng)的資源,消耗更多的時間,而相比較UDP協(xié)議傳輸過程則不會出現(xiàn)這種問題。

總結來講,基于TCP協(xié)議傳輸,需要不斷的確認對方是否收到信息,從而建立連接(確認過程次數有限制,即三次握手),UDP協(xié)議傳輸則
不需要確認接收端是否收到信息,只需要將信息發(fā)給對方。

TCP/IP協(xié)議棧、HTTP協(xié)議、Socket之間的區(qū)別和聯(lián)系?

TCP/IP協(xié)議棧就是一系列網絡協(xié)議,可以分為四層模型來分析:應用層、傳輸層、網絡層、鏈路層;

HTTP協(xié)議(超文本傳輸協(xié)議)就是在這一協(xié)議棧中的應用層協(xié)議;HTTP協(xié)議簡單來說,它的作用就是規(guī)范數據的格式,讓程序能夠方便的識別,并且收發(fā)雙方都需要遵循同樣的協(xié)議格式進行數據傳輸。(應用層的協(xié)議也和HTTP協(xié)議的作用類似,不一樣的是定義不同的數據格式。)

Socket可以理解為TCP/IP協(xié)議棧提供的對外的操作接口,即應用層通過網絡協(xié)議進行通信的接口。Socket可以使用不同的網絡協(xié)議進行端對端的通信;

TCP Socket服務器的通信過程?

Server端:

建立連接(socket()函數創(chuàng)建socket描述符、bind()函數綁定特定的監(jiān)聽地址(ip+port)、listen()函數監(jiān)聽socket、accept()阻塞等待客戶端連接)

數據交互(read()函數阻塞等待客戶端發(fā)送數據、write()函數發(fā)送給客戶端數據)

Client端:

建立連接(socket()函數創(chuàng)建socket描述符、connect()函數向指定的監(jiān)聽地址發(fā)送連接請求)

數據交互(wirte()函數發(fā)送服務端數據、read()函數足阻塞等待接受服務端發(fā)送的數據)

socket和websocket之間的聯(lián)系?

webosocket是一種通信協(xié)議,不同于HTTP請求,客戶端請求服務端資源,服務端響應的通信過程;websocket允許服務端主動
向客戶端推送消息,同時做到客戶端和服務端雙向通訊的協(xié)議。(具體底層原理有待后面實踐,暫時未接觸)

HTTP,WSGI協(xié)議的聯(lián)系和區(qū)別?

HTTP協(xié)議(超文本傳輸協(xié)議),屬于TCP/IP協(xié)議棧中應用層的協(xié)議。用于規(guī)范傳輸數據的格式,是一種客戶端和服務端傳輸的規(guī)則。

WSGI協(xié)議則是Python定義的Web服務器和框架程序通信的接口規(guī)則。兩者聯(lián)系不大,強行說的話,Python框架程序主要處理的是HTTP請求。

(后期可以實現(xiàn)一個WSGI協(xié)議的Python框架,用于處理HTTP請求的實驗。)

主流Web框架,異步Web框架?

主流Web框架:Django、Flask

異步Web框架:Tornado(內置異步模塊)、Snaic(Python自帶asyncio)、FastAPI(基于Starlette庫) 、aiohttp(基于asyncio)

asyncio,aiohttp之間的聯(lián)系?(異步編程)

asyncio是一個異步IO庫,aiohttp就是基于asyncio的異步HTTP框架(支持客戶端/服務端)

代碼設計

Python提供了基本的socket模塊:

  1. socket模塊;提供了標準的BSD Sockets API;
  2. socketserver模塊:提供了服務器中心類,簡化服務器的開發(fā);

TCP Socket服務端

socket模塊:

# -*- coding: utf-8 -*-
from socket import socket, AF_INET, SOCK_STREAM

def echo_handler(sock ,address):
	print("Get Connection from address:", address)

	while True:
		response = sock.recv(8192)
		if not response:
			break
		print(f"Got {response}")
		sock.sendall(response)

def echo_server(address, back_log=5):
	sock = socket(AF_INET, SOCK_STREAM)
	sock.bind(address)
	sock.listen(back_log)

	while True:
		sock_client, address = sock.accept()
		echo_handler(sock_client, address)

if __name__ == "__main__":
	echo_server(('localhost', 5000))

代碼詳解:

  • 創(chuàng)建一個基于IPV4和TCP協(xié)議的Socket,這里AF_INET指的是使用IPV4協(xié)議,SOCK_STREAM指定使用面向流的TCP協(xié)議,綁定監(jiān)聽端口,設置等待連接的最大數量
  • 創(chuàng)建一個永久循環(huán),獲取客戶端請求的連接,accept()會等待并返回一個客戶端的連接;
  • 連接建立后,等待客戶端數據,接受完客戶端數據,然后返回數據給客戶端,最后關閉連接

存在的問題:當出現(xiàn)多個客戶端請求時,由于是單個線程會發(fā)生阻塞的情況,所以如果需要多線程處理多個客戶端請求,可以這樣改;

from threading import Thread

while True:
        client_sock, address = sock.accept()
        thread = Thread(target=echo_handler, args=(client_sock, address))
        thread.start()

這樣的話,就會在每個客戶端請求的時候,生成一個子線程然后處理請求;
(但是存在一個問題:當突然大量請求連接,消耗系統(tǒng)資源達到上限后,很可能造成程序無法處理后續(xù)請求。)

socketserver模塊:

from socketserver import BaseRequestHandler, TCPServer

class EchoHandler(BaseRequestHandler):
    def handle(self):
        print("Got Connection From: %s" % str(self.client_address))
        while True:
            msg = self.request.recv(8192)
            if not msg:
                break
            self.request.send(msg)

if __name__ == "__main__":
    server = TCPServer(("", 5000), EchoHandler)
    server.serve_forever()
from socketserver import StreamRequestHandler, TCPServer, ThreadingTCPServer
import time

class EchoHandler(StreamRequestHandler):
    def handle(self):
        print("Got Connection Address: %s" % str(self.client_address))
        for line in self.rfile:
            print(line)
            self.wfile.write(bytes("hello {}".format(line.decode('utf-8')).encode('utf-8')))

if __name__ == "__main__":
    serv = ThreadingTCPServer(("", 5000), EchoHandler)
    serv.serve_forever()

代碼詳解:

  • 處理多個客戶端,初始化一個ThreadingTCPServer實例;
  • 設置綁定的IP地址和端口,以及處理類;
  • 使用StreamRequestHandler(使用流的請求處理程序類,類似file-like對象,提供標準文件接口簡化通信過程),重寫里面的handle方法,獲取請求數據,返回數據給客戶端;

TCP Socket客戶端

socket模塊:

# -*- coding: utf-8 -*-
from socket import socket, AF_INET, SOCK_STREAM
import time

def request_handler():
	start_time = time.time()
	sock_client = socket(AF_INET, SOCK_STREAM)
	sock_client.connect(('localhost', 5000))
	
	book_content = ""
	with open("send_books.txt", "r") as f:
		book_content = f.read()
	
	content_list = book_content.split("\n")
	for content in content_list:
		if content:
			sock_client.send((content).encode())
			time.sleep(2)
			response = sock_client.recv(8192)
			print(response)

	end_time = time.time()
	print("總共耗時:", end_time-start_time)

		

if __name__ == "__main__":
	request_handler()

UDP Socket

Socket模塊:

from socket import socket, AF_INET, SOCK_DGRAM
import time

def time_server(address):
    sock = socket(AF_INET, SOCK_DGRAM)
    sock.bind(address)

    while True:
        msg, addr = sock.recvfrom(8192)
        print('Get message from', addr)
        resp = time.ctime()
        sock.sendto(resp.encode('ascii'), addr)

if __name__ == "__main__":
    time_server(('', 5000))

代碼不詳解,和之前的差不多,注意不同的協(xié)議就完事了

客戶端測試:

from socket import socket, AF_INET, SOCK_DGRAM

if __name__ == "__main__":
    s = socket(AF_INET, SOCK_DGRAM)
    s.sendto(b'hello', ('localhost', 5000))
    text = s.recvfrom(8192)
    print(text)

socketserver模塊:

from socketserver import BaseRequestHandler, UDPServer
import time


class TimeHandler(BaseRequestHandler):
    def handle(self):
        print("Got Connection %s".format(str(self.client_address)))
        data = self.request[0]
        print(data)
        msg, sock = self.request
        print(msg)
        data = time.ctime()
        sock.sendto(data.encode('ascii'), self.client_address)

if __name__ == "__main__":
    u = UDPServer(("localhost", 9999), TimeHandler)
    u.serve_forever()

代碼不在贅述,如果需要多線程處理并發(fā)操作可以使用ThreadingUDPServer

總結

關于本篇介紹Python Socket編程,大都是皮毛,只是談到了Python實際處理socket的幾個模塊,
關于socket底層方面的知識并未提及,先了解個大概,從實際使用方面出發(fā),在實際使用過程中結合
計算機網絡知識,能夠對socket在整個TCP/IP協(xié)議棧中的作用。

socket和socketserver模塊都可以用來編寫網絡程序,不同的是socketserver省事很多,你可以專注
業(yè)務邏輯,不用去理會socket的各種細節(jié),包括不限于多線程/多進程,接收數據,發(fā)送數據,通信過程。

以上就是Python Socket編程詳解的詳細內容,更多關于Python Socket編程的資料請關注腳本之家其它相關文章!

相關文章

  • Python操作配置文件ini的三種方法講解

    Python操作配置文件ini的三種方法講解

    今天小編就為大家分享一篇關于Python操作配置文件ini的三種方法講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 僅用幾行Python代碼就能復制她的U盤文件?

    僅用幾行Python代碼就能復制她的U盤文件?

    上大學的時候有老師不給上課的PPT,就總想有個程序能偷偷復制老師的U盤一直沒有去實現(xiàn),最近不想看論文就想起來這個事情了,發(fā)現(xiàn)其實用幾行python代碼就能搞定.分兩步,首先寫出來python代碼,其次把.py文件轉換成exe文件,直接在windows電腦上后臺運行,需要的朋友可以參考下
    2021-06-06
  • Python與Java間Socket通信實例代碼

    Python與Java間Socket通信實例代碼

    這篇文章主要介紹了Python與Java間Socket通信實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • 使用Python操作Excel中的各項頁面設置功能

    使用Python操作Excel中的各項頁面設置功能

    在使用Excel進行數據分析或報告制作時,頁面設置是確保最終輸出效果專業(yè)、美觀的關鍵步驟,合理的頁面設置不僅能夠優(yōu)化打印效果,還能提升數據的可讀性,本文將詳細介紹如何使用Python操作Excel中的各項頁面設置功能,需要的朋友可以參考下
    2024-08-08
  • PyTorch中torch.manual_seed()的用法實例詳解

    PyTorch中torch.manual_seed()的用法實例詳解

    在Pytorch中可以通過相關隨機數來生成張量,并且可以指定生成隨機數的分布函數等,下面這篇文章主要給大家介紹了關于PyTorch中torch.manual_seed()用法的相關資料,需要的朋友可以參考下
    2022-06-06
  • python中open函數的基本用法示例

    python中open函數的基本用法示例

    這篇文章主要給大家介紹了關于python中open函數的基本用法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Python的進制轉換和ASCLL轉換你了解嗎

    Python的進制轉換和ASCLL轉換你了解嗎

    這篇文章主要為大家詳細介紹了Python的進制轉換和ASCLL轉換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python 開發(fā)工具PyCharm安裝教程圖文詳解(新手必看)

    Python 開發(fā)工具PyCharm安裝教程圖文詳解(新手必看)

    PyCharm是一種Python IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制。今天通過本文給大家分享PyCharm安裝教程,一起看看吧
    2020-02-02
  • TensorFlow實現(xiàn)簡單線性回歸

    TensorFlow實現(xiàn)簡單線性回歸

    這篇文章主要為大家詳細介紹了TensorFlow實現(xiàn)簡單線性回歸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解決phantomjs截圖失敗,phantom.exit位置的問題

    解決phantomjs截圖失敗,phantom.exit位置的問題

    今天小編就為大家分享一篇解決phantomjs截圖失敗,phantom.exit位置的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論