深入理解 Python網路程式設計

2021-10-02 09:00:16 字數 4397 閱讀 1612

乙個簡單的socket案例

socket粘包的概念

socketserver(高階)

開發的過程遇到的坑以及心得

待更新一些網路知識

啥是ddos攻擊(洪水攻擊),就是一些機器通過偽造ip位址頭,不斷的去訪問(攻擊)乙個**,導致**的崩潰的現象,乙個**能接受的併發量是有限的,通過洪水攻擊,十幾台機器大量偽造ip位址,就可以搞垮乙個**,所以大企業要建立大規模的集群。

什麼是socket

socket又叫套接字,我們的網路通訊比如http,ftp,ssh他們都要接收資料和傳送資料的過程,我們把這個接收資料的過程和傳送資料的過程封裝起來就是socket,通常我們用乙個socket表示「開啟了乙個網路鏈結」

socket內建的方法

socket.socket:宣告socket型別,並建立socket物件

socket.bind((『127.0.0.1』,80)):繫結埠,必須注意這裡是乙個元組,ip位址使用字串的形式寫入元組

socket.listen(5):監聽埠,可以設定乙個最大連線數,最多可以設定多少個連線

server.accept():接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的位址。接收tcp 客戶的連線(阻塞式)等待連線的到來,這個函式用來表示乙個等待的狀態

server.close:關閉套接字

sc.recv(bufsize[,flag]):

接受套接字的資料。資料以字串形式返回,bufsize指定最多可以接收的多少位元組。flag提供有關訊息的其他資訊,通常可以忽略。

sc.send(string[,flag]):

將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部傳送。

sc.sendall() :就是簡單的迴圈send

socket.gethostname():獲取本地主機名

乙個簡單的socket案例

服務端**:

#!/usr/local/bin/python3

#coding:utf-8

"""思路:

1.服務端先import socket

2.建立socket並連線

2.進行埠的繫結,使用bind,傳乙個元組進去

4.監聽埠

5.等待連線

6.接收到資料

7.傳送資料

"""import socket

server = socket.socket(

)# 宣告socket型別,同時生成socket連線物件

server.bind(

('127.0.0.1'

,9999))

# 繫結埠

server.listen(5)

## 監聽埠,引數可以設定最多連線數,也就是最多可以掛起多少個連線

print

('我要開始等**了'

)conn, addr = server.accept(

)# server.accept()會返回兩個值,乙個是標誌位,乙個是位址位

# cron是客戶端連過來而在服務端為其生成的乙個例項

print

("**來了"

)# 聽**

data = conn.recv(

1024

)# recv的大小是有限制的,不能一次性都接收過來

print

("recv:"

, data)

conn.send(data.upper())

# send的時候不能send為空,不然就會一直卡在這裡

server.close(

)

客戶端**

#!/usr/local/bin/python3

#coding:utf-8

# 實現網路程式設計,思路是

"""1.先建立socket連線,

2.傳送資料

3。接收資料

"""import socket

client = socket.socket(

)# 建立socket型別,同時生成socket連線物件

client.connect(

('127.0.0.1'

,9999))

# 連線這裡必須是乙個元組

client.send(b"hello"

)# 以bytes型別傳送,python3不能直接發字串,python2都可以

data = client.recv(

1024

)# 設定接收1k的資料,在centos裡面設定很大都不會報錯,但是ubuntu會

print

(data)

client.close(

)

改進上面的**,實現一直在互相通訊

客戶端

import socket

client = socket.socket(

)#宣告socket型別,同時生成socket連線物件

client.connect(

('localhost'

,6969))

while

true

: msg =

input

(">>:"

).strip()if

len(msg)==0

:continue

client.send(msg.encode(

"utf-8"))

data = client.recv(

10240

)print

("recv:"

,data.decode())

client.close(

)

服務端

import socket

client = socket.socket(

)#宣告socket型別,同時生成socket連線物件

client.connect(

('localhost'

,6969))

while

true

: msg =

input

(">>:"

).strip()if

len(msg)==0

:continue

client.send(msg.encode(

"utf-8"))

data = client.recv(

10240

)print

("recv:"

,data.decode())

client.close(

)

這個好像沒啥意思,但是依賴這些基礎可以做個ssh工具或者ftp。

socket粘包的概念

1.「粘包」, 即伺服器端你呼叫時send 2次,但你send呼叫時,資料其實並沒有立刻被傳送給客戶端,而是放到了系統的socket傳送緩衝區裡,等緩衝區滿了、或者資料等待超時了,資料才會被send到客戶端,這樣就把好幾次的小資料拼成乙個大資料,統一傳送到客戶端了,這麼做的目地是為了提高io利用效率,一次性傳送總比連發好幾次效率高嘛。 但也帶來乙個問題,就是「粘包」,即2次或多次的資料粘在了一起統一傳送了。

2.解決粘包的問題:我們可以在兩次send之間加上乙個recv()來接收確認資訊,然後在另一方傳送確認資訊,conn.recv()會一直等待客戶端發個確認資訊過來,這樣避免粘包,我們也可以讓程式sleep(0.5)秒來避免,但是會降低程式效能,這是一種比較笨的方法。

socketserver(高階)

socketserver是socket的再封裝,socket無法支援多使用者,而socketserver支援多使用者多併發。

使用socketserver的步驟:

首先必須自己建立乙個請求處理類,這個類要繼承自baserequesthandle,然後重寫父類的handle方法。

例項化tcpserver,然後傳遞server_ip和我們建立的請求處理類作為引數給tcpserver

呼叫server.handle_request():只能處理一次

呼叫server.serve_forever()可以處理多次。

finally, callserver_close()to close the socket.

開發的過程遇到的坑以及心得

初學網路程式設計,邊學邊做,遇到開發的一些巨坑。

待更

深入理解網路程式設計(二)

深入理解網路程式設計 二 1 socket程式設計 serversocket 方法 socket accept 如果接收到乙個客戶端socket的連線請求,該方法將返回乙個與連線客戶端socket對應的socket serversocket int port serversocket int por...

python深入 Python的深入理解

處理檔案和目錄 python 3 帶有乙個模組叫做 os,代表 作業系統 operating system os 模組 包含非常多的函式用於獲取 和修改 本地目錄 檔案程序 環境變數等的資訊。python 盡最大的努力在所有支援的作業系統上提供乙個統一的api,這樣你就可以在保證程式能夠在任何的計算...

深入理解Python類

c 中,類有兩個關鍵的內建函式,建構函式和析構函式。在python中,其實也有類似的函式,他們就是 def init self pass def del self pass def enter self pass def exit self pass在物件建立時執行操作。在物件析構時執行操作。注意 ...