乙個簡單的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在物件建立時執行操作。在物件析構時執行操作。注意 ...