愛情動(dòng)做網(wǎng)站推薦收錄批量查詢
實(shí)驗(yàn)三
實(shí)驗(yàn)題目
1、請(qǐng)利用生成器構(gòu)造一下求階乘的函數(shù)Factorial(),定義一個(gè)函數(shù)m(),在m()中調(diào)用生成器Factorial()生成小于100的階乘序列存入集合s中,輸出s。
【代碼】
def factorial():n=1f=1while 1:? f *= n? yield (f)? n+=1def m():s=set()for f in factorial():? if f<100:? s.add(f)? else:? breakprint(s)m()
【實(shí)例】
2、利用UDP協(xié)議編寫一個(gè)小型交互軟件,要求如下:
(1)建立文件UDPT.py,在該文件中定義類UDPTalk,其析構(gòu)函數(shù)傳入ip地址和端口號(hào),成為其私有屬性;
(2)定義類UDPTalk的成員函數(shù)ServerU,建立一個(gè)服務(wù)器端應(yīng)用,用于接收客戶端的信息,并輸出客戶端發(fā)來的信息;
(3)定義類UDPTalk的成員函數(shù)ClientU,建立一個(gè)客戶端應(yīng)用,用于向服務(wù)器端發(fā)送信息
(4)建立文件SUT.py,在該文件中引入U(xiǎn)DPTalk類,并定義一個(gè)ServerApp函數(shù),在該函數(shù)中聲明一個(gè)該類的對(duì)象,調(diào)用ServerU函數(shù),創(chuàng)建接收信息服務(wù)器,運(yùn)行這個(gè)函數(shù),等待客戶端發(fā)來信息。
(5)建立文件CUT.py,在該文件中引入U(xiǎn)DPTalk類,并定義一個(gè)ClientApp函數(shù),聲明一個(gè)該類的對(duì)象,調(diào)用ClientU函數(shù),向(4)中的服務(wù)器發(fā)信息
【代碼】
UDPT.pyimport socketclass UDPTalk:def __init__(self, ip, port):? self.ip = ip? self.port = port? self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)def ServerU(self):? self.sock.bind((self.ip, self.port))? print(f"服務(wù)器已啟動(dòng),正在監(jiān)聽 {self.ip}:{self.port}...")? while 1:? data, addr = self.sock.recvfrom(1024)? received_msg = data.decode()? print(f"客戶端 [{addr[0]}:{addr[1]}] 發(fā)送的消息:{received_msg}")def ClientU(self):? server_addr = (self.ip, self.port)? print(f"連接到服務(wù)器 {self.ip}:{self.port}...")? while 1:? message = input("請(qǐng)輸入要發(fā)送的消息(輸入 'quit' 退出):")? if message == 'quit':? print("已退出客戶端應(yīng)用。")? break? self.sock.sendto(message.encode(), server_addr)? print("消息已發(fā)送。")def __del__(self):? self.sock.close()SUT.pyfrom UDPT import UDPTalkdef ServerApp():server = UDPTalk('localhost', 12345)server_alive = Truetry:? server.ServerU()except KeyboardInterrupt:? server_alive = False? print("客戶端已退出。")finally:? if server_alive:? print("客戶端已退出。")if __name__ == '__main__':ServerApp()CUT.pyfrom UDPT import UDPTalkdef ClientApp():client = UDPTalk('localhost', 12345)client.ClientU()if __name__ == '__main__':ClientApp()
【實(shí)例】
3、利用TCP協(xié)議編寫一個(gè)小型交互軟件,要求如下:
(1)建立文件TCPT.py,在該文件中定義類TCPTalk,其構(gòu)造函數(shù)傳入ip地址和端口號(hào),成為其私有屬性;
(2)定義類TCPTalk的成員函數(shù)ServerU,建立一個(gè)服務(wù)器端應(yīng)用,用于接收客戶端的信息,并輸出客戶端發(fā)來的信息;
(3)定義類TCPTalk的成員函數(shù)ClientU,建立一個(gè)客戶端應(yīng)用,用于向服務(wù)器端發(fā)送信息
(4)建立文件STT.py,在該文件中引入TCPTalk類,并定義一個(gè)ServerApp函數(shù),在該函數(shù)中聲明一個(gè)該類的對(duì)象,調(diào)用ServerU函數(shù),創(chuàng)建接收信息服務(wù)器,運(yùn)行這個(gè)函數(shù),等待客戶端發(fā)來信息。
(5)建立文件CTT.py,在該文件中引入TCPTalk類,并定義一個(gè)ClientApp函數(shù),聲明一個(gè)該類的對(duì)象,調(diào)用ClientU函數(shù),向(4)中的服務(wù)器發(fā)信息。
【代碼】
CTT.pyfrom TCPT import TCPTalk
def ClientApp():client = TCPTalk('localhost', 12345)client.ClientU()
if __name__ == '__main__':ClientApp()STT.pyfrom TCPT import TCPTalkdef ServerApp():server = TCPTalk('localhost', 12345)server.ServerU()if __name__ == '__main__':ServerApp()TCPT.pyimport socketclass TCPTalk:def __init__(self, ip, port):? self.ip = ip? self.port = port? self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)? self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)def ServerU(self):? self.sock.bind((self.ip, self.port))? self.sock.listen(1)? print(f"服務(wù)器已啟動(dòng),正在監(jiān)聽 {self.ip}:{self.port}...")? while 1:? conn, addr = self.sock.accept()? print(f"客戶端 [{addr[0]}:{addr[1]}] 已連接。")? while 1:? data = conn.recv(1024)? if not data:? break? received_msg = data.decode()? print(f"客戶端 [{addr[0]}:{addr[1]}] 發(fā)送的消息:{received_msg}")? print(f"客戶端 [{addr[0]}:{addr[1]}] 已斷開連接。")? conn.close()def ClientU(self):? server_addr = (self.ip, self.port)? self.sock.connect(server_addr)? print(f"連接到服務(wù)器 {self.ip}:{self.port}...")? while 1:? message = input("請(qǐng)輸入要發(fā)送的消息(輸入 'quit' 退出):")? if message == 'quit':? print("已退出客戶端應(yīng)用。")? break? self.sock.send(message.encode())? print("消息已發(fā)送。")? self.sock.close()
【實(shí)例】
4、請(qǐng)修改題目3中的TCPTalk類,將題目1中求階乘的函數(shù)Factorial()和m()變?yōu)門CPTalk類的成員函數(shù),當(dāng)客戶端函數(shù)ClientU向服務(wù)器發(fā)送信息“1” (即ServerU函數(shù)接收到的數(shù)據(jù)為“1”)時(shí),則ServerU調(diào)用m()。分別運(yùn)行ServerU和ClientU程序,測(cè)試上述設(shè)計(jì)。
【代碼】
改變后的TCPT.py
import socket
class TCPTalk:def __init__(self, ip, port):self.ip = ipself.port = portself.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)def factorial(self):? self.n = 1? self.f = 1? while 1:? self.f *= self.n? yield (self.f)? self.n += 1def m(self):? self.s = set()? for self.f in self.factorial():? if self.f < 100:? self.s.add(self.f)? else:? break? print(self.s)def ServerU(self):self.sock.bind((self.ip, self.port))self.sock.listen(1)print(f"服務(wù)器已啟動(dòng),正在監(jiān)聽 {self.ip}:{self.port}...")while 1:conn, addr = self.sock.accept()print(f"客戶端 [{addr[0]}:{addr[1]}] 已連接。")while 1:data = conn.recv(1024)if not data:breakreceived_msg = data.decode()print(f"客戶端 [{addr[0]}:{addr[1]}] 發(fā)送的消息:{received_msg}")if received_msg == '1':result = self.m(5) # 示例調(diào)用 m() 函數(shù),參數(shù)為 5print(f"調(diào)用 m() 函數(shù)的結(jié)果:{result}")print(f"客戶端 [{addr[0]}:{addr[1]}] 已斷開連接。")conn.close()def ClientU(self):server_addr = (self.ip, self.port)self.sock.connect(server_addr)print(f"連接到服務(wù)器 {self.ip}:{self.port}...")while 1:message = input("請(qǐng)輸入要發(fā)送的消息(輸入 'quit' 退出):")if message == 'quit':print("已退出客戶端應(yīng)用。")breakself.sock.send(message.encode())print("消息已發(fā)送。")self.sock.close()
【實(shí)例】