-
使用模塊
(socket)套接字模塊: 套接字模塊是一個非常簡單的基於對象的接口,它提供對低層BSD套接字樣式網絡的訪問 。使用該模塊可以實現客戶機和服務器套接字。
所謂的套接字是爲特定網絡協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網絡應用程序提供者提供當前可移植標準的對象。 它們允許程序接受並進行連接,如發送和接受數據。爲了建立通信通道,網絡通信的每個端點擁有一個套接字對象極爲重要 。 -
建立服務器
第1步:創建socket對象
s = socket.socket(family,type)
family 的值可以是AF_UNIX(unix域,用於同一臺機器上的進程間通訊),也可以是AF_INET(對應於ip協議的TCP或UDP)
Type參數的值可以是: SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。
我們這裏使用udp數據報文套接字;
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
第2步:將socket綁定到指定地址上:s.bind(address),address 必須是一個雙元素組,(host,port) *一定要注意這個不是填寫兩個參數進去,一定要是一個雙元組
我們這裏綁定本機8081端口: s.bind(("", port))
第3步:調用recvfrom方法接收客戶端發來的數據,recvfrom方法需指定可接收的最大數據量。將返回數據內容和客戶端地址;
import socket
port = 8081
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", port))
print “waiting on port:”, port
while True:
data, addr = s.recvfrom(1024)
print “Received:”, data, “from”, addr
3) 客戶端建立
建立客戶端很簡單,只用創建套接字對象,指定端口,調用sendto方法傳輸數據就ok了,如下;
import socket
port = 8081
host = “localhost”
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(“Hello! It’s working.”, (host, port))
使用數據報方式發送簡短的文本信息是非常簡單的,如果你想要可靠的傳輸數據,這種方法是不可行,如果服務器不可用,信息就會丟失,下一節將學習如何使用tcp協議來傳輸信息。
希望本文所述對大家的Python程序設計有所幫助。
三、 綜合的代碼:
import argparse
import socket
from datetime import datetime
MAX_BYTES = 65535
def server(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 注意下面這裏是一個二元組,並不是一個兩個元素
sock.bind(('127.0.0.1', port))
print('Listening at {}'.format(sock.getsockname()))
while True:
# 下面這個函數recvfrom的含義是接收數據,變量是表示接收的最大數量
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode('ascii')
print('The client at {} says {!r}'.format(address, text))
text = 'Your data was {} bytes long'.format(len(data))
data = text.encode('ascii')
sock.sendto(data, address)
def client(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
text = 'The time is {}'.format(datetime.now())
data = text.encode('ascii')
sock.sendto(data, ('127.0.0.1', port))
print('The OS assigned me the address {}'.format(sock.getsockname()))
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode('ascii')
print('The server replied {!r}'.format(address, text))
#argparse的作用就是在命令行中直接輸出指定的提示符
#並且要按照add_argument()函數的方式來添加指定的參數,而且可以指定參數的類型,默認值等
if __name__ == '__main__':
choices = {'client': client, 'server': server}
parser = argparse.ArgumentParser(description='Send and receive UDP locally')
parser.add_argument('role', choices=choices, help='which role to play')
parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')
args = parser.parse_args()
function = choices[args.role]
function(args.p)