Python socket程式設計例項詳解

2022-10-04 22:36:32 字數 3005 閱讀 3139

複製** **如下:

sock=socket.socket(socket.af_inewww.cppcns.comt,socket.sock_stream)

上面的**建立了乙個socket物件。type引數代表套接字型別,可為sock_stream(流套接字)和sock_dgram(資料報套接字)。af_inet表示建立的是ip v4的型別。

複製** **如下:

socket(addr程式設計客棧ess_family,type,protocol_type):

上面三個引數的含義是:

address_family指明要建立哪一類socket。最常用的當然是ip協議,af_inet。在unix系統中,af_unix也是比較常用的,用於建立unix系統中的程序間通訊。

type用於指定通訊型別。通常是建立面向連線的流通信。socket_dgram是報文通訊。如果address_family設定的是af_inet,那麼對應的是tcp和udp。

protocol用於指定協議型別。這個引數是可選的。在建立tcp或者是udp連線的時候他們通常都是0。如果第乙個引數是af_inet,那麼這個引數表示是ip包中的protocol欄位。

【udp本來就不區分server和client。所有節點都是對等的】

第二步是將socket繫結到指定的位址:

複製** **如下:

sock.bind(('localhost',7556))

第三步是使用listen方法監聽請求:【listen方法中的引數指明可接受的最大連線數】

複製** **如下:

sock.listen(5)

第四步是不斷接收請求:收到連線請求後,這些請求需要排隊,如果佇列滿,就拒絕請求。

複製** **如下:

connection,address = sock.accept()

accept方法返回乙個含有兩個元素的 元組(connection,address)。第乙個元素connection是新的socket物件,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的internet位址。

第五步是處理階段,伺服器和客戶端通過send和recv方法通訊(傳輸資料)。

如果send成功了,那麼對方的緩衝區已經有你傳送的資料了。

#呼叫recv 時,伺服器必須指定乙個整數,它對應於可通過本次方法呼叫來接收的最大資料量。recv方法在接收資料時會進入「blocked」狀態,最後返回乙個字元 串,用它表示收到的資料。如果程式設計客棧傳送的資料量超過了recv所允許的,資料會被截短。多餘的資料將緩衝於接收端。以後呼叫recv時,多餘的資料會從緩衝區 刪除(以及自上次呼叫recv以來,客戶可能傳送的其它任何資料)。

connection.settimeout(5)

buf = connection.recv(1024)

具體處理如下:

if buf == '1':

connection.send('welcome to python server!')

else:

connection.send('please go out!')

使用send傳送資料給客戶端。客戶端使用recv來接收資料。

import socket程式設計客棧

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

sock.connect(('localhost',7556))

import time

time.sleep(2)

sock.send('1')

print sock.recv(1024)

sock.close()

這就是整個通訊過程了。

全部**如下:

server端:

#!/usr/bin/env python

import socket

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

sock.bind(('localhost',7556))

sock.listen(5)

while true:

connection,address = sock.accept()

print "client ip is "

print address

try:

connection.settimeout(5)

buf = connection.recv(1024)

if buf == '1':

connection.send('welcome to python server!')

else:

connection.send('please go out!')

except socket.timeout:

print 'time out'

connection.close()

client端如下:

#!/usr/bin/env python

import socket

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

sock.connect(('localhost',7556))

import time

time.sleep(2)

sock.send('1')

print sock.recv(1024)

sock.close()

記住,socket使用完畢之後要關閉。【上面的**,server端忘記關閉socket了】

當然,在socket連線的過程中,最好使用try except來做一下錯誤處理。

注意,accept函式和recv函式都是阻塞式的。也就是說,他們一直在等待,直到有客戶端連線過來或者是後者的有資料可以接收。

下面是乙個ftp的小例子。

使用了多執行緒來處理每乙個請求。

示例**點選此處本站**。

如果傳輸路徑不存在則建立。

本文標題: python 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...