socket網路程式設計學習之tcp與udp

2021-10-14 01:33:31 字數 3982 閱讀 7114

不管你採用的是哪種位址家族,都有兩種不同風格的套接字連線。第一種是面向連線的

這意味著在進行通訊之前必須先建立乙個連線,例如,使用**系統給乙個朋友打**。這

種型別的通訊也稱為虛擬電路或流套接字。48 第 1 部分 通用應用主題

面向連線的通訊提供序列化的、可靠的和不重複的資料交付,而沒有記錄邊界。這基本

上意味著每條訊息可以拆分成多個片段,並且每一條訊息片段都確保能夠到達目的地,然後

將它們按順序組合在一起,最後將完整訊息傳遞給正在等待的應用程式。

實現這種連線型別的主要協議是傳輸控制協議(更為人熟知的是它的縮寫 tcp)。為 了

建立 tcp 套接字,必須使用 sock_stream 作為套接字型別。tcp 套接字的名字

sock_stream 基於流套接字的其中一種表示。因為這些套接字(af_inet)的網路版本

使用網際網路協議(ip)來搜尋網路中的主機,所以整個系統通常結合這兩種協議(tcp 和 ip)

來進行(當然,也可以使用 tcp 和本地[非網路的 af_local/af_unix]套接字,但是很明

顯此時並沒有使用 ip)。

與虛擬電路形成鮮明對比的是資料報型別的套接字,它是一種無連線的套接字。這意味

著,在通訊開始之前並不需要建立連線。此時,在資料傳輸過程中並無法保證它的順序性、

可靠性或重複性。然而,資料報確實儲存了記錄邊界,這就意味著訊息是以整體傳送的,而

並非首先分成多個片段,例如,使用面向連線的協議。

使用資料報的訊息傳輸可以比作郵政服務。信件和包裹或許並不能以傳送順序到達。

事實上,它們可能不會到達。為了將其新增到併發通訊中,在網路中甚至有可能存在重複

的訊息。

既然有這麼多***,為什麼還使用資料報呢(使用流套接字肯定有一些優勢)?由於面

向連線的套接字所提供的保證,因此它們的設定以及對虛擬電路連線的維護需要大量的開銷。

然而,資料報不需要這些開銷,即它的成本更加「低廉」。因此,它們通常能提供更好的效能,

並且可能適合一些型別的應用程式。

實現這種連線型別的主要協議是使用者資料報協議(更為人熟知的是其縮寫 udp)。為 了

建立 udp 套接字,必須使用 sock_dgram 作為套接字型別。你可能知道,udp 套接字的

sock_dgram 名字來自於單詞「datagram」(資料報)。因為這些套接字也使用網際網路協議

來尋找網路中的主機,所以這個系統也有乙個更加普通的名字,即這兩種協議(udp 和 ip)

的組合名字,或 udp/ip。

from socket import *

ip =

'0.0.0.0'

port =

1314

buflen =

512ssk =

socket

(af_inet, sock_stream)

ssk.

bind

((ip,port)

)ssk.

listen(5

)print

("服務端啟動成功,等待客戶端連線。。。"

)tsk, addr = ssk.

accept()

print

("接受客戶端連線:"

,addr)

while true:

#接受客戶端返回的位元組碼

recved = tsk.

recv

(buflen)

if not recved:

break

message = recved.

decode

()#解碼成str

print (f'收到對方資訊:'

) # print

('收到對方資訊:'

) tsk.

send

(f"服務端收到了資訊"

.encode()

)#編碼字串

tsk.

close()

ssk.

close

()

from socket import *

ip =

'127.0.0.1'

server_port =

1314

buflen =

512tsk =

socket

(af_inet, sock_stream)

tsk.

connect

((ip, server_port)

)while true:

tosend =

input

('>>> '

)if tosend ==

'byebye'

:break

tsk.

send

(tosend.

encode()

) recved = tsk.

recv

(buflen)

if not recved:

break

print

(recved.

decode()

)tsk.

close

()

from socket import * #匯入socket

from time import ctime

print

("---------------------------服務端udp------------------------------------"

)#設定埠,位址

port =

520ip =

'0.0.0.0'

max =

1024

#建立socket物件

usk =

socket

(af_inet,sock_dgram)

#繫結埠位址

usk.

bind

((ip,port)

)print

("服務端啟動成功"

)#資訊傳輸

while true:

#接收資訊

data,addr = usk.

recvfrom

(max)

print

("連線成功,等待對方傳送資訊"

) usk.

sendto((

'[%s] %s'%(

ctime()

,data)).

encode()

,addr)

usk.

close

()

from socket import * #匯入socket

print

("---------------------------客戶端udp------------------------------------"

)#埠位址

port =

520ip=

'127.0.0.1'

max =

1024

#建立psk =

socket

(af_inet,sock_dgram)

# #連線

# psk.connect((ip,port))

while true:

data =

input

('>'

)if not data:

break

psk.

sendto

(data.

encode()

,(ip,port)

) data,

(ip,port)

= psk.

recvfrom

(max)

if not data:

break

print

(data)

psk.

close

()

c 學習之Socket網路程式設計

我是新手以前沒寫過部落格 希望大家勿噴,在編寫socket的時候需要匯入system.net.socket命名空間。利用該類我們可以直接編寫socket的客戶端和服務的的程式了,這裡我們只講tpc協議下的socket程式設計。tcp socket連線的過程可以簡單的分為 服務端監聽 客戶端請求 建立...

Python之socket網路程式設計

實現主機間或一台電腦上的程序間進行通訊 例項如下 服務端 匯入socket sys模組 import socket import sys 建立socket物件 serversocket socket.socket socket.af inet,socket.sock stream 獲取本地主機名 h...

Python之Socket網路程式設計

socket起源於unix,而unix linux基本哲學之一就是 一切皆檔案 對於檔案用 開啟 讀寫 關閉 模式來操作。socket就是該模式的乙個實現,socket即是一種特殊的檔案,一些socket函式就是對其進行的操作 讀 寫io 開啟 關閉 socket和file的區別 1 file模組是...