python基礎(12) 初識Socket

2022-05-29 12:33:10 字數 4069 閱讀 1794

socket:

網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個socket。

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

現在是初學,把socket理解為乙個**撥通**,接聽**!通訊的乙個概念!

socket在寫的時候要記住:有發就有收,收發必相等!一發一收,四字秘訣!

第乙個socket**

import

socket

#建立socket物件

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

#設定監聽的ip與埠

sk.bind(('

127.0.0.1

',6666))

#設定client最大等待連線數

sk.listen(5)

while

true:

print("

waiting client connection............")

#只有accept & recv會阻塞,這裡accept阻塞,直到client連線過來

#connection代表客戶端物件,address是客戶端的ip

connection,address =sk.accept()

#等待接收客戶端資訊

client_message = connection.recv(1024)

#列印客戶端資訊

print('

client send message

',client_message)

#傳送回執資訊給client ,收發必須相同

connection.sendall(bytes('

hello client this server

','utf8'))

#關閉和client的連線

connection.close()

socket_server

import

socket

#建立socket物件

ck =socket.socket()

#通過ip&埠連線server

ck.connect(('

127.0.0.1

',6666))

#傳送訊息給服務端

ck.sendall(bytes('

hello server this is client

','utf8'))

#接收服務端的訊息並列印

server_answer = ck.recv(1024)

print

(server_answer)

#關閉連線

ck.close()

socket_client

為了更加清晰,繪圖如下:

socket建立引數詳解:

server:

#

建立socket物件

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

#socket.af_inet 引數一

#socket.sock_stream 引數二

引數一:位址簇

socket.af_inet ipv4(預設)

socket.af_inet6 ipv6

socket.af_unix 只能夠用於單一的unix系統程序間通訊

引數二:型別

socket.sock_stream 流式socker,for tcp(預設)

socket.sock_dgram 資料報式socket,for udp

socket.sock_raw原始套接字,普通的套接字無法處理icmp、igmp等網路保溫,而sock_raw可以;其次,sock_raw也可以處理特殊的ipv4報文;此外,利用原始套接字,可以通過ip_hdrincl套接字選項由使用者構造ip頭。

socket.sock_rdm是一種可靠的udp形式,即保證交付資料報但不保證順序,sock_ram用來提供對原始協議的低階訪問,在需要執行某些特殊操作時使用,如傳送icmp報文。sock_ram通常僅限於高階使用者或管理員執行的程式使用。

socket.sock_seqpacket 可靠的連續資料報服務

引數三:協議

在建立socket物件的時候一般使用預設即可:sk = socket.socket()

sk.bind(address)

s.bind(address)將套接字繫結到位址。address位址的格式取決於位址族。在af_inet下,以元組(host,port)的形式表示位址。

sk.listen(backlog)

開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。

backlog等於5,表示核心已經接到了連線請求,但伺服器還沒有呼叫accept進行處理的連線個數最大為5

這個值不能無限大,因為要在核心中維護連線佇列

sk.setblocking(bool)

是否阻塞(預設true),如果設定false,那麼accept和recv時一旦無資料,則報錯。

sk.accept()

接收連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的位址。

接收tcp客戶的連線(阻塞式)等待連線的到來

sk.connect(address)

連線到address處的套接字。一般,address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。

sk.connect_ex(address)

同上,只不過會有返回值,連線成功時返回0,連線失敗時候返回編碼,例如:10061

sk.close()

關閉套接字

sk.recv(bufsize[,flag])

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

sk.send(string[,flag])

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

sk.sendall(string[,flag])

將string中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料。成功返回none,失敗則丟擲異常。

內部通過遞迴呼叫send,將所有內容傳送出去

sk.sendto(string[,flag],address)

將資料 傳送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址,返回值是傳送的位元組數。該函式主要用於udp協議。

sk.settimeout(timeout)

設定套接字操作的超時期,timeout是乙個浮點數,單位是秒。值為none表示沒有超時期。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如client連線最多等待5s)

sk.getpeername()

返回連線套接字的遠端位址,返回值通常是元組(ipadr,port)

sk.getsockname()

返回套接字自己的位址。通常是乙個元組(ipaddr,port)

sk.fileno()

套集資的檔案描述符

Python基礎初識

python的創始人為吉多 範羅蘇姆 guido van rossum 1989年的聖誕節期間,吉多 範羅蘇姆 中文名字 龜叔 為了在阿姆斯特丹打發時間,決心開發乙個新的指令碼解釋程式,作為abc語言的一種繼承。龜叔 2005年加入谷歌至2012年,2013年加入dropbox直到現在,依然掌握著p...

python基礎初識

目錄1.變數 什麼是變數?變數就是把程式執行的中間結果臨時存在記憶體中,以便後續 使用 變數如何使用?name meet 這樣就是在定義乙個變數,name 是乙個變數名 是乙個賦值操作 賦值就是將值交給name meet 是乙個值 變數的作用 暱稱,就是代指記憶體中某個位址中的內容 我們定義變數的時...

python基礎 01初識python

python簡介 語言是人類最重要的交際工具,是人類之間進行資訊交換的主要表達方式。怎麼用,為什麼可以這麼用。程式語言是用來定義電腦程式的語言,用來向計算機發出指令。python語言是一種物件導向的解釋型計算機程式語言。強型別 a 123 整數 弱型別 a 123 隨環境變化 動態語言 不需要直接指...