基於Python的Socket程式設計

2021-10-01 07:55:38 字數 4018 閱讀 2590

socket基礎

socket的英文原義是"孔"或"插座",最初作為bsd unix的程序通訊機制,也被稱作"套接字",用於描述ip位址和埠,是乙個通訊鏈的控制代碼,可用來實現不同虛擬機器或不同計算機之間的通訊。在internet上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個socket,並繫結到乙個埠上,不同的埠對應於不同的服務。

基於伺服器端和客戶端的socket原語

bind():繫結。引數傳入要繫結的ip位址和埠。

ip位址必須是主機上的乙個可用的位址(當主機上存在多個ip時,繫結位址0.0.0.0可以監聽所有可用的ip);

埠必須是乙個該socket協議未被占用的埠,若一主機上的多個程式試圖同時繫結到80埠時,只有乙個程式能成功。

伺服器端程式在listen()之前必須進行bind()操作,客戶端程式若在connect()原語之前沒呼叫bind(),系統會自動分配乙個未被占用的位址和埠。

accept():接收連線。只在伺服器端有用,從監聽到的連線中取出乙個,並將其包裝成乙個新的socket物件。完成accept()標誌著socket已完成了tcp鏈路建立階段的3次握手。若無客戶端連線請求,則accept()呼叫會阻塞等待。

send():傳送資料。以bytes型別進行資料的傳輸

recv():接收資料。若socket中無訊息可讀取,預設情況下recv()呼叫會被阻塞直至有訊息到達

close():關閉連線。一方呼叫,另一方收到後也呼叫close()關閉連線。

包socket封裝了所有python的原生socket操作

tcp-serverse.py:

'''tcp-socket伺服器端'''

import socket

import datetime

host =

'0.0.0.0'

#ipport =

3434

#埠#af_inet說明使用ipv4位址,sock_stream指明tcp

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

s.bind(

(host,port)

)#繫結ip與埠

s.listen(1)

#監聽while

true

: conn,addr = s.accept(

)#接受tcp連線,並返回新的socket物件

print

('client %s connected!'

%str

(addr)

)#輸出客戶端的ip位址

dt = datetime.datetime.now(

) message =

"current time is "

+str

(dt)

mes_change =

bytes

(message,encoding=

'utf-8'

)#將str型別轉碼為經過編碼後的bytes型別

conn.send(mes_change)

#向客戶端傳送當前時間

print

("sent:"

,message)

conn.close(

)#關閉連線

tcp-client.py:

'''tcp-socket客戶端'''

import socket

import os

host =

'127.0.0.1'

port =

3434

#af_inet說明使用ipv4位址,sock_stream指明tcp協議

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

s.connect(

(host,port)

)print

("connect %s:%d ok"

%(host,port)

)data = s.recv(

1024

)#接收最大長度為1024的資料

print

("received: "

,data)

s.close(

)#關閉連線

os.system(

'pause'

)#暫停程式,避免直接結束,看不到結果

效果圖:

注意:先執行伺服器端**tcp-serverse.py:,再執行客戶端**tcp-client.py

伺服器端**主體處於while迴圈中,故程式將不斷監聽並一直執行,當有客戶端連線成功後將當前系統時間傳送給客戶端並馬上關閉連線

客戶端的socket埠號由系統自動分配

udp相對於tcp在傳輸層提供更少的控制,沒有建立連線、斷開等概念,所以基於udp的socket通訊過程也比tcp稍微簡單。在udp中可直接通過指定ip:port進行資料收發。udp socket可以復用tcp中的socket()和bind()原語,除此之外,udp屬於自己的socket原語如下:

udp-serverse.py:

'''udp-socket伺服器端'''

import socket

host =

'0.0.0.0'

#ipport =

3434

#埠#af_inet說明使用ipv4位址,sock_dgram指明udp

s = socket.socket(socket.af_inet,socket.sock_dgram)

s.bind(

(host,port)

)#繫結ip與埠

while

true

: data,addr = s.recvfrom(

1024

)#本次接收最大資料長度為1024

print

('receiverd:%s from %s'

%(data,

str(addr)))

s.close(

)

udp-client.py:

'''udp-socket客戶端'''

import socket

import os

host =

'127.0.0.1'

port =

3434

#af_inet說明使用ipv4位址,sock_dgram指明udp協議

s = socket.socket(socket.af_inet,socket.sock_dgram)

data =

'hello udp!!!'

data_change =

bytes

(data,encoding=

'utf-8'

)s.sendto(data_change,

(host,port)

)print

('sent:%s to %s:%d'

%(data,host,port)

)s.close(

)#關閉連線

os.system(

'pause'

)#暫停程式,避免直接結束,看不到結果

效果圖:

注意:先執行伺服器端**udp-serverse.py:,再執行客戶端**udp-client.py

客戶端直接呼叫sendto()向指定的位址傳送資料

客戶端埠63140由客戶端程式在呼叫sendto()時自動生成

基於python的socket簡單實現

socket被翻譯為 套接字 它是計算機之間進行通訊的一種約定或一種方式。socket的生命週期如下 1.將socket與位址和埠進行繫結 2.開啟服務端,等待連線 3.建立連線 4.傳送和接收資料 5.關閉連線,關閉服務端 簡單來說,就是開啟,建立連線,傳輸資料,關部的過程 具體 如下 與瀏覽器通...

Python基於socket實現簡單套接字通訊

客戶端的connect對應的服務端的accept 三次握手 服務端既可以發訊息也可以收訊息 客戶端 coding utf 8 import socket 1 先有手機 socket型別 網路通訊 流式就是tcp協議 phone socket.socket socket.af inet,socket....

基於TCP的socket程式設計

sockets 套接字 程式設計有三種,流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於 tcp的 socket 程式設計是採用的流式套接字。在這個程式中,將兩個工程新增到乙個工作區。要鏈結乙個 ws2 32.lib 的庫檔案。伺服器端程式設...