Python3.6寫socket程序

Python進行Socket程序編寫使用的主要模塊就是 socket 模塊,在這個模塊中能夠找到 socket()函數,該函數用於建立套接字對象。套接字也有本身的方法集,這些方法能夠實現基於套接字的網絡通訊。服務器

一、socket()模塊函數網絡

要建立套接字,必須使用 socket.socket()函數,它通常的語法以下。socket

socket(socket_family, socket_type, protocol=0)

其中,socket_family 是 AF_UNIX 或 AF_INET(如前所述),socket_type 是SOCK_STREAM或 SOCK_DGRAM(也如前所述)。protocol 一般省略,默認爲 0。tcp

因此,爲了建立 TCP/IP 套接字,能夠用下面的方式調用 socket.socket()。函數

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)spa

一樣,爲了建立 UDP/IP 套接字,須要執行如下語句。code

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)對象

由於有不少 socket 模塊屬性,因此此時使用「from module import *」這種導入方式能夠接受,不過這只是其中的一個例外。若是使用「from socket import *」,那麼咱們就把 socket屬性引入到了命名空間中。雖然這看起來有些麻煩,可是經過這種方式將可以大大縮短代碼,正以下面所示。blog

tcpSock = socket(AF_INET, SOCK_STREAM)utf-8

一旦有了一個套接字對象,那麼使用套接字對象的方法將能夠進行進一步的交互。

二、套接字對象(內置)方法

常見的套接字對象方法和屬性

名稱 描述
服務器套接字方法
s.bind() 將地址(主機名、端口號對)綁定到套接字上
s.listen() 設置並啓動TCP監聽器
s.accept() 被動接受TCP客戶端鏈接,一直等待指導鏈接到達(阻塞)
客戶端套接字方法
s.connect() 主動發起TCP服務器鏈接
s.connect_ex() connect()的擴展版本,此時會以錯誤碼的形式返回問題,而不是拋出一個異常
普通的套接字方法
s.recv() 接收 TCP 消息
s.recv_into() 接收 TCP 消息到指定的緩衝區
s.send() 發送 TCP 消息
s.sendall()  完整地發送 TCP 消息
s.recvfrom()  接收 UDP 消息
s.recvfrom_into() 接收 UDP 消息到指定的緩衝區
s.sendto() 發送 UDP 消息
s.shutdown()  關閉鏈接
s.close()  關閉套接字

 三、幾個實例。

目前不少教材都是用的Python2.7版本,TCP和UDP部分都有點小問題。

本身分別用TCP和UDP寫了時間戳的程序,用的是Python3.6版本。

TCP-Server:

 1 # -*- coding: utf-8 -*-
2 from socket import * 3 from time import ctime 4 5 HOST = '' 6 PORT = 21567 7 BUFSIZ = 1024 8 ADDR = (HOST, PORT) 9 10 tcpSerSock = socket(AF_INET, SOCK_STREAM)#建立服務器套接字 11 tcpSerSock.bind(ADDR)#套接字與地址綁定 12 tcpSerSock.listen(5)#監聽鏈接 13 14 while True: 15 print('waiting for connection...') 16 tcpCliSock, addr = tcpSerSock.accept()#接受客戶端鏈接 17 print('...connected from:', addr) 18 19 while True: 20 data = tcpCliSock.recv(BUFSIZ)#接收 21 if not data: 22 break 23 tcpCliSock.send(('[%s] %s' % (ctime(), data.decode())).encode()) 24 #發送 25 tcpCliSock.close() 26 tcpSerSock.close()

 

TCP-Client:

 1 # -*- coding: utf-8 
 2 from socket import *
 3 
 4 HOST = '127.0.0.1'
 5 PORT = 21567
 6 BUFSIZ = 1024
 7 ADDR = (HOST, PORT)
 8 
 9 tcpCliSock = socket(AF_INET, SOCK_STREAM)
10 tcpCliSock.connect(ADDR)
11 
12 while True:
13     data = input('> ')
14     if not data:
15         break
16     tcpCliSock.send(data.encode())#用encode轉換成bytes
17     data = tcpCliSock.recv(BUFSIZ)
18     if not data:
19         break
20     print(data.decode('utf-8'))#用decode轉換成str
21 
22 tcpCliSock.close()

 

UDP-Server:

 1 # -*- coding: utf-8 -*-
2 from socket import * 3 from time import ctime 4 5 HOST = '' 6 PORT = 21567 7 BUFSIZ = 1024 8 ADDR = (HOST, PORT) 9 10 udpSerSock = socket(AF_INET, SOCK_DGRAM) 11 udpSerSock.bind(ADDR) 12 13 while True: 14 print('waiting for message...') 15 data, addr = udpSerSock.recvfrom(BUFSIZ) 16 udpSerSock.sendto(('[%s] %s' % (ctime(), data.decode())).encode(), addr) 17 print('...received from and returned to:', addr) 18 19 udpSerSock.close()

 

UDP-Client:

 1 # -*- coding: utf-8 -*-
 2 from socket import *
 3 
 4 HOST = 'localhost'
 5 PORT = 21567
 6 BUFSIZ = 1024
 7 ADDR = (HOST, PORT)
 8 
 9 udpCliSock = socket(AF_INET, SOCK_DGRAM)
10 
11 while True:
12     data = input('> ')
13     if not data:
14         break
15     udpCliSock.sendto(data.encode(), ADDR)
16     data, ADDR = udpCliSock.recvfrom(BUFSIZ)
17     if not data:
18         break
19     print(data.decode())
20 
21 udpCliSock.close()
相關文章
相關標籤/搜索