Python在網絡通訊方面功能強大,學習一下Socket通訊的基本方式
UDP通訊:
Server:
import socketport=8081s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#從指定的端口,從任何發送者,接收UDP數據s.bind(('',port))print('正在等待接入...')while True: #接收一個數據 data,addr=s.recvfrom(1024) print('Received:',data,'from',addr)Client:
import socketport=8081host='localhost's=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.sendto(b'hello,this is a test info !',(host,port))
很簡單 。下面是TCP方式:
Server:
#-*- coding: utf-8 -*-from socket import *from time import ctimeHOST=''PORT=12345BUFSIZ=1024ADDR=(HOST, PORT)sock=socket(AF_INET, SOCK_STREAM)sock.bind(ADDR)sock.listen(5)while True: print('waiting for connection') tcpClientSock, addr=sock.accept() print('connect from ', addr) while True: try: data=tcpClientSock.recv(BUFSIZ) except: print(e) tcpClientSock.close() break if not data: break s='Hi,you send me :[%s] %s' %(ctime(), data.decode('utf8')) tcpClientSock.send(s.encode('utf8')) print([ctime()], ':', data.decode('utf8'))tcpClientSock.close()sock.close()Client:
#-*- coding: utf-8 -*-from socket import *class TcpClient: HOST='127.0.0.1' PORT=12345 BUFSIZ=1024 ADDR=(HOST, PORT) def __init__(self): self.client=socket(AF_INET, SOCK_STREAM) self.client.connect(self.ADDR) while True: data=input('>') if not data: break self.client.send(data.encode('utf8')) data=self.client.recv(self.BUFSIZ) if not data: break print(data.decode('utf8')) if __name__ == '__main__': client=TcpClient()上面的TCP方式有個問題,不能退出,好吧,我們改造一下,使這個程序可以發送quit命令以退出:
Server:
#-*- coding: utf-8 -*-from socket import *from time import ctimefrom time import localtimeimport timeHOST=''PORT=1122 #設置偵聽端口BUFSIZ=1024ADDR=(HOST, PORT)sock=socket(AF_INET, SOCK_STREAM)sock.bind(ADDR)sock.listen(5)#設置退出條件STOP_CHAT=Falsewhile not STOP_CHAT: print('等待接入,偵聽端口:%d' % (PORT)) tcpClientSock, addr=sock.accept() print('接受連接,客戶端地址:',addr) while True: try: data=tcpClientSock.recv(BUFSIZ) except: #print(e) tcpClientSock.close() break if not data: break #python3使用bytes,所以要進行編碼 #s='%s發送給我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8')) #對日期進行一下格式化 ISOTIMEFORMAT='%Y-%m-%d %X' stime=time.strftime(ISOTIMEFORMAT, localtime()) s='%s發送給我的信息是:%s' %(addr[0],data.decode('utf8')) tcpClientSock.send(s.encode('utf8')) print([stime], ':', data.decode('utf8')) #如果輸入quit(忽略大小寫),則程序退出 STOP_CHAT=(data.decode('utf8').upper()=="QUIT") if STOP_CHAT: breaktcpClientSock.close()sock.close()
新聞熱點
疑難解答