Python socket 程式設計入門

2021-10-03 18:45:09 字數 2664 閱讀 6429

可以簡單地認為,socket 就是作業系統對於 tcp 連線的封裝。通過 socket,我們可以進行簡單可靠的網路傳輸。

我們打算編寫這麼乙個簡單的程式:

客戶端與服務端建立連線,埠為6666。

服務端傳送資訊,詢問名字。

客戶端傳送名字資訊。

服務端傳送歡迎資訊。

斷開連線,客戶端退出。

客戶端的**比較簡單。

client.py

import socket

# af_inet是address family: internet的縮寫,如果你要使用ipv6,就傳入socket.af_inet6

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

sock.connect(('127.0.0.1', 6666))

# 一次只接受1kb的資料,這個值是比較合理的

b = sock.recv(1024)

# 注意,網路傳輸的資料都是bytes型別

print(b.decode('utf-8'))

name = input('')

sock.send(name.encode('utf-8'))

b = sock.recv(1024)

print(b.decode('utf-8'))

sock.close()

要進行 socket 程式設計,首先要初始化乙個 socket 物件,如果你要用 ipv4 進行通訊,就傳入 socket.af_inet 和 socket.sock_stream,這是最常用的配置。接著,我們用 connect 方法連線上服務端,然後用 recv 和 send 方法進行資料的往來。最後一定要記得用 close 方法關閉 socket。

服務端的**稍微複雜一些,要用到多執行緒。

server.py

import socket

import threading

def processlink(sock):

sock.send(b"what's your name?")

r = sock.recv(1024)

greeting = b'hello, ' + r + b'!'

sock.send(greeting)

sock.close()

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

sock.bind(('127.0.0.1', 6666))

# 5表示正在「排隊」的連線個數最多是5,由於我們這個示例程式比較簡單,

# 所以基本上不可能出現處理不過來排隊的現象,因而這個值不太重要,5是最常見的取值

sock.listen(5)

while true:

(s, addr) = sock.accept()

thread = threading.thread(target=processlink, args=(s,))

thread.start()

與客戶端不同,服務端要呼叫 bind 方法繫結埠,然後用 listen 方法開始監聽。接著我們用乙個無限迴圈來等待連線,如果有客戶端連進來,accpet 方法就會返回乙個 tuple,包含客戶端的 socket 和網路位址,然後我們建立乙個新的執行緒來處理這個連線。如果不用多執行緒,那麼一次只能同時處理乙個連線了!

編寫完之後,我們首先開啟 server.py,然後開啟 client.py,就會看到以下結果:

socket 程式設計就是圍繞著 socket 物件的,我們一般用 s = socket.socket(socket.af_inet, socket.sock_stream) 來初始化乙個 socket 物件。

下面的**列舉了 socket 物件的常用方法。

方法名稱

引數說明

作用s.recv(size)

size:最多接受的位元組數

接受資訊

s.send(data)

data:要傳送的資料

傳送資訊,返回傳送成功的位元組數,也就是說,不一定能全部傳送

s.sendall(data)

data:要傳送的資料

傳送資訊,盡量保證全部傳送,如果做不到,丟擲乙個異常

s.settimeout(timeout)

timeout:操作阻塞的最大時間

如果 timeout 是 none,表示無限阻塞,如果是 0,表示不阻塞,如果是非零的值,超過該時間(單位:秒)後會丟擲 socket.timeout 異常

s.close()

關閉 socket

方法名稱

引數說明

作用s.connect(addr)

連線服務端

方法名稱

引數作用

作用sock.bind(addr)

繫結到要監聽的埠

sock.listen(max)

max:排隊(未處理)的連線數的最大值

開始監聽

sock.accept()

與客戶端建立連線,返回值是乙個 tuple,第乙個元素是客戶端的 socket,第二個元素是客戶端的位址

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...