Python Socket 程式設計詳細介紹

2021-10-06 21:39:38 字數 4148 閱讀 1569

原文看這裡

python 提供了兩個基本的 socket 模組:

下面講解下 socket模組功能。

套接字格式:socket(family, type[,protocal]) 使用給定的套接族,套接字型別,協議編號(預設為0)來建立套接字

socket 型別

描述socket.af_unix

用於同一臺機器上的程序通訊(既本機通訊)

socket.af_inet

用於伺服器與伺服器之間的網路通訊

socket.af_inet6

基於ipv6方式的伺服器與伺服器之間的網路通訊

socket.sock_stream

基於tcp的流式socket通訊

socket.sock_dgram

基於udp的資料報式socket通訊

socket.sock_raw

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

socket.sock_seqpacket

可靠的連續資料報服務

建立tcp socket:

sock = socket.socket(socket.af_inet, socket.sock_stream)
建立udp socket:

sock = socket.socket(socket.af_inet, socket.sock_dgram)
伺服器與客戶端不能直接傳送列表,元素,字典等帶有資料型別的格式,傳送的內容必須是字串資料。

伺服器端 socket 函式

socket 函式

描述s.bind(address)

將套接字繫結到位址,在af_inet下,以tuple(host, port)的方式傳入,如s.bind((host, port))

s.listen(backlog)

開始監聽tcp傳入連線,backlog指定在拒絕鏈結前,作業系統可以掛起的最大連線數,該值最少為1,大部分應用程式設為5就夠用了

s.accept()

客戶端 socket 函式

socket 函式

描述s.connect(address)

鏈結到address處的套接字,一般address的格式為tuple(host, port),如果鏈結出錯,則返回socket.error錯誤

s.connect_ex(address)

功能與s.connect(address)相同,但成功返回0,失敗返回errno的值

公共 socket 函式

socket 函式

描述s.recv(bufsize[, flag])

接受tcp套接字的資料,資料以字串形式返回,buffsize指定要接受的最大資料量,flag提供有關訊息的其他資訊,通常可以忽略

s.send(string[, flag])

傳送tcp資料,將字串中的資料傳送到鏈結的套接字,返回值是要傳送的位元組數量,該數量可能小於string的位元組大小

s.sendall(string[, flag])

完整傳送tcp資料,將字串中的資料傳送到鏈結的套接字,但在返回之前嘗試傳送所有資料。成功返回none,失敗則丟擲異常

s.recvfrom(bufsize[, flag])

接受udp套接字的資料u,與recv()類似,但返回值是tuple(data, address)。其中data是包含接受資料的字串,address是傳送資料的套接字位址

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

傳送udp資料,將資料傳送到套接字,address形式為tuple(ipaddr, port),指定遠端位址傳送,返回值是傳送的位元組數

s.close()

關閉套接字

s.getpeername()

返回套接字的遠端位址,返回值通常是乙個tuple(ipaddr, port)

s.getsockname()

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

s.setsockopt(level, optname, value)

設定給定套接字選項的值

s.getsockopt(level, optname[, buflen])

返回套接字選項的值

s.settimeout(timeout)

設定套接字操作的超時時間,timeout是乙個浮點數,單位是秒,值為none則表示永遠不會超時。一般超時期應在剛建立套接字時設定,因為他們可能用於連線的操作,如s.connect()

s.gettimeout()

返回當前超時值,單位是秒,如果沒有設定超時則返回none

s.fileno()

返回套接字的檔案描述

s.setblocking(flag)

如果flag為0,則將套接字設定為非阻塞模式,否則將套接字設定為阻塞模式(預設值)。非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引起socket.error異常。

s.makefile()

建立乙個與該套接字相關的檔案

tcp 伺服器

1、建立套接字,繫結套接字到本地ip與埠

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

s.bind()

2、開始監聽鏈結

s.listen()
3、進入迴圈,不斷接受客戶端的鏈結請求

while true:

s.accept()

4、接收客戶端傳來的資料,並且傳送給對方傳送資料

s.recv()

s.sendall()

5、傳輸完畢後,關閉套接字

s.close()
tcp 客戶端
s = socket.socket(socket.af_inet, socket.sock_stream)

s.connect()

2、鏈結後傳送資料和接收資料

s.sendall()

s.recv()

3、傳輸完畢後,關閉套接字

import socket

host = '192.168.1.100'

port = 8001

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

s.bind((host, port))

s.listen(5)

print 'server start at: %s:%s' %(host, port)

print 'wait for connection...'

while true:

conn, addr = s.accept()

print 'connected by ', addr

while true:

data = conn.recv(1024)

print data

conn.send("server received you message.")

# conn.close()

import socket

host = '192.168.1.100'

port = 8001

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

s.connect((host, port))

while true:

cmd = raw_input("please input msg:")

s.send(cmd)

data = s.recv(1024)

print data

#s.close()

哈姆雷特,請保持前行!

Python Socket 程式設計

client import socket,sys if name main 處理引數 argv sys.argv if len argv 3 or len argv 2 and argv 1 print useage argv 0 sys.exit 0 host argv 1 server ip位址...

python socket程式設計

python 編寫server的步驟 1.第一步是建立socket物件。呼叫socket建構函式。如 socket socket.socket family,type family引數代表位址家族,可為af inet或af unix。af inet家族包括internet位址,af unix家族用於...

python socket程式設計

客戶端 author lenovo fromsocketimport host localhost port 2157 bufsize 1024 addr host,port tcpclient socket af inet,sock stream tcpclient.connect addr wh...