import argparse,socket
def recvall(sock,length):
"""傳入一個套接字,和一個長度"""
# 定義一個二進制的變數
data = https://www.cnblogs.com/cong12586/p/b''
# 回圈
while len(data) < length:
print(len(data),length)
# more用來接收規定長度減去data的長度
# 注意這里,recv函式是阻塞的,如果他沒有接收到資料,那么就一直卡在那里,
# 有兩種情況,如果每次發送的資料都比我們設定的長度要少,那么第二次回圈,就會卡主
# 還有一種就是我們發送的位元組數正好是我們規定長度的整數倍,那么最后一次回圈就為空了,
# 針對這個,我們可以在發送端和接收端都來一個結束標識,
more = sock.recv(length - len(data))
if more == b'efo':break
if not more:
raise EOFError('was expecting %d bytes but only received '
'd% bytes before the socket closed ' %(length ,len(data)))
data += more
return data
def server(interface,port):
# 定義一個套接字,用于TCP連接
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 設定套接字連接
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 套接字系結埠和IP地址
sock.bind((interface,port))
# 設定套接字的監聽客戶端的監聽數量,
sock.listen(1)
# 列印出服務端連接系結的IP地址和埠
print("listening at",sock.getsockname())
# 死回圈遍歷,用來重復的進行和監聽服務端,然后進行通信,
while True:
# 服務端套接字用來接收客服端的連接請求,
sc,socketname = sock.accept()
print("We have accepted a connection from",socketname)
print(" Socket name:",sc.getsockname())
print(" Socket peer:",sc.getpeername())
# 規定每次接收客戶端傳過來的訊息長度
message = recvall(sc,16)
print('222222')
# 列印出來接受到的資料,
print(' Incoming sixteen-octet message:',repr(message))
# 服務端發送二進制訊息,
sc.sendall(b'Farewell,client')
sc.sendall(b'efo')
sc.close()
print(" Reply sent ,scoket closed")
# 定義客戶端函式,入參為IP地址和埠
def client(host,port):
# 定義一個TCP 連接的套接字,
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 建立和服務端的TCP連接,
# 注意這里傳入的是一個元祖
sock.connect((host,port))
# 列印客戶端連接的IP和埠
print('Client has been assigned socket name',sock.getsockname())
# 客戶端發送二進制訊息
sock.sendall(b'Hi there,server')
# 發送一個結束標識
sock.sendall(b'efo')
# 客戶端接收服務端發送過來的訊息
reply = recvall(sock,16)
# 列印出來服務端發送的訊息
print('222222')
print('The server said' ,repr(reply))
# 關閉套接字
sock.close()
if __name__ == "__main__":
# 定義一個字典
choices = {'client':client,'server':server}
parser = argparse.ArgumentParser(description = 'Send and receive over TCP')
parser.add_argument('role',choices = choices,help = 'which role to play')
parser.add_argument('host',help = 'interface the server listens at;'
' host the client sends to')
parser.add_argument('-p',metavar = "PORT",type = int,default = 1060,help = "TCP port (default 1060")
args = parser.parse_args()
function = choices[args.role]
function(args.host,args.p)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/202162.html
標籤:Python
上一篇:python selenium list index out of range
下一篇:扒開機械硬碟堅硬的外殼!
