Day 27 socket程式設計

2021-10-09 03:59:47 字數 3539 閱讀 7404

為什麼揮手需要四次:因為揮手過程中沒有資料產生

udp協議為什麼不安全:發完資料不等確認,然後就會把資料刪除

​ 首先我們要知道socket是對傳輸層及以下(傳輸層,網路層,資料鏈層,物理層)的封裝,它是一組藉口,在設計模式中,socket其實就是乙個門面模式,他把複雜的tcp/ip協議族隱藏在socket藉口後面,對使用者來說,一組簡單的藉口就是全部,讓socket去組織資料,以符合指定的協議。

套接字的發展史和分類:

套接字起源於20世紀70年代加利福尼亞大學伯克利分校版本的unix,即人們所說的bsd unix。因此,有時人們也把套接字稱為「伯克利套接字」或「bsd套接字」。一開始,套接字被設計用在同 一台主機上多個應用程式之間的通訊。這也被稱程序間通訊,或 ipc。套接字有兩種(或者稱為有兩個種族),分別是基於檔案型的和基於網路型的。

套接字家族的名字:af_unix

unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊

套接字家族的名字:af_inet

(還有af_inet6被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有位址家族中,af_inet是使用最廣泛的乙個,python支援很多種位址家族,但是由於我們只關心網路程式設計,所以大部分時候我麼只使用af_inet)

套接字工作流程

先從伺服器端說起。伺服器端先初始化socket,然後與埠繫結(bind),對埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化乙個socket,然後連線伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取資料,最後關閉連線,一次互動結束

import socket

# 建立服務物件

server = socket.socket(socket.af_inet, socket.sock_stream)

# 繫結位址

# 也可以把位址 設定為 "127.0.0.1",不過這只能自己跟自己玩 埠號可以自己設定一般用1024-65535

server.bind(

("192.168.11.78"

,8080))

# 執行服務

server.listen(5)

# backlog = 5 半連線池數量

# 等待連線

connect, address = server.accept(

)# 收發訊息

while

true

:try

: data = connect.recv(

1024

)# 最大接受位元組長度,超出1024會在下次接受

iflen

(data)==0

:break

print

(f"服務端已收到訊息, 訊息內容為:"

) connect.send(

"我已出倉感覺良好!"

.encode(

"utf8"))

# 收到訊息後的回應

except exception:

break

# 連線關閉

# connect.close()

server.close(

)

import socket

# 建立客戶端

client = socket.socket(socket.af_inet, socket.sock_stream)

# 建立連線

client.connect(

("192.168.11.78"

,8080))

while

true

: msg =

input

("請輸入你要傳送的訊息:"

)# 傳送訊息

client.send(msg.encode(

"utf8"))

# 收訊息

data = client.recv(

1024

)print

(data.decode(

"utf8"

))

注意

"""

服務端應該滿足的特性:

1、一直對外提供服務

2、併發地提供服務

"""import socket

import subprocess

# 1、買手機

phone = socket.socket(socket.af_inet, socket.sock_stream)

# sock_stream=》tcp協議

# 2、插手機卡

phone.setsockopt(socket.sol_socket, socket.so_reuseaddr,1)

# 就是它,在bind前加

phone.bind(

("127.0.0.1"

,8080))

# 本地回環

# 3、開機

phone.listen(5)

print

('starting %s:%s'%(

"127.0.0.1"

,8080))

# 4、等**鏈結=>鏈結迴圈

while

true

: conn, client_addr = phone.accept(

)print

(client_addr)

# 5、收/發訊息=>通訊迴圈

while

true

:try

: cmd = conn.recv(

1024

)# 最大接收的位元組個數

iflen

(cmd)==0

:# 針對linux系統

break

obj = subprocess.popen(cmd.decode(

'utf-8'),

shell=

true

, stdout=subprocess.pipe,

stderr=subprocess.pipe

)res=obj.stdout.read(

)+obj.stderr.read(

)# ???

print

(res)

conn.send(res)

except exception:

# 針對windows系統

break

# 6、關閉

conn.close(

)# 掛**

phone.close(

)# 關機

Day42 socket程式設計

1.socket程式設計的概念 2.socket 類詳解 3.tcp伺服器端 實現import socket from pprint import pprint 建立tcp連線 socket instance socket.socket socket.af inet,socket.sock stre...

學習筆記 day27

表單 form 屬性 action 提交路徑,請求路徑 method get 明信片 提引數url,容量有限,不安全,有快取,post 信封 提引數url,請求實體 相對安全 理論沒有限制 put delete enctype enctype multipart form data 在存在檔案的時候...

每日演算法 day 27

那些你早出晚歸付出的刻苦努力,你不想訓練,當你覺的太累了但還是要咬牙堅持的時候,那就是在追逐夢想,不要在意終點有什麼,要享受路途的過程,或許你不能成就夢想,但一定會有更偉大的事情隨之而來。mamba out 2020.3.12 記憶化 記憶化的思考方式 主要就是從搜尋開始進行思考然發現哪些分枝會大量...