第一篇:計算機網絡原理實驗三
實驗
三、套接字編程
序號: 姓名: 字麗梅 學號: 20091120216 成績
1.實驗目的:
兩人一組,編寫一個客戶端、服務器程序,掌握Socket編程原理。2.實驗環境:
連入局域網絡的主機一臺。3.實驗指導:
Socket API是實現進程間通信的一種編程設施,也是一種為進程間提供底層抽象的機制。理解socket編程模型及其原理。4.實驗分析,回答下列問題。
a.運行指導書中的程序,并修改服務器的功能(自己思考),改寫成多線程web服務器(選作),附上源代碼,并加關鍵代碼注釋。
b.給出程序調試和運行的截圖。
c.回答下列問題:
(1)為什么在服務器和客戶端要包含winsock2.h文件?
答:Windows網絡編程至少需要兩個頭文件:winsock2.h和windows.h。
(2)為什么在服務器和客戶端程序中要加入#pragma comment(lib,“ws2_32.lib”)語句,如果不加會出現什么問題?
答:#pragma comment(lib,“ws2_32.lib”)表示鏈接ws2_32.lib這個庫。該庫對應ws2_32.dll,提供了對某些網絡相關API的支持,若使用其中的API,則應該將ws2_32.lib加入工程,如果不加入#pragma comment(lib,“ws2_32.lib”),則不能使用其中的API,即得不到相關API的支持。
(3)為什么在服務器和客戶端程序中要使用WSAStartup函數,如果不用程序會有什么問題?
答:本函數必須是應用程序或DLL調用的第一個Windows Sockets函數.它允許應用程序或DLL指明Windows Sockets API的版本號及獲得特定Windows Sockets實現的細節。應用程序或DLL只能在一次成功的WSAStartup()調用之后才能調用進一步的Windows Sockets API函數。如果不用應用程序或DLL就不能進一步的調用Windows Sockets API函數,程序就不能繼續執行。
(4)如果服務器程序中沒有memset(server.sin_zero, 0, sizeof(server.sin_zero));語句,程序會出現什么錯誤,為什么?
答:沒有錯誤,注釋這一條語句后,程序調試成功,實現訪問。
(5)如果先運行客戶端程序,程序會有什么現象,為什么會有這一現象?
答:程序跳出運行,并顯示”can not creat connect!”因為沒有相應的服務器與之創立鏈接。
(6)如果服務器程序所在計算機沒有連接網絡,程序會發生什么錯誤?我們捕獲到什么錯誤信息?
答:如果服務器程序所在計算機沒有鏈接網絡,則執行程序后出現:
binding stream socket: No error Press any key to continue...(7)上述服務器是串行處理多個客戶端的請求,如何該成并發處理的服務器? 答:用父進程調用accept,然后調用fork,這樣,已連接套接口就在父進程與子進程間共享,一般來說,接下來便是子進程讀、寫已連接套接口并關閉偵聽套接口,而父進程則關閉已連接套接口。
第二篇:計算機網絡原理實驗三
實驗
三、套接字編程
1.實驗目的:
兩人一組,編寫一個客戶端、服務器程序,掌握Socket編程原理。2.實驗環境:
連入局域網絡的主機一臺。3.實驗指導:
Socket API是實現進程間通信的一種編程設施,也是一種為進程間提供底層抽象的機制。理解socket編程模型及其原理。4.實驗分析,回答下列問題。
a.運行指導書中的程序,并修改服務器的功能(自己思考),改寫成多線程web服務器(選作),附上源代碼,并加關鍵代碼注釋。服務器:
#include “stdafx.h” #include
for(i=0;i<=1000;i++)//循環控制 { memset(buf, 0, sizeof(buf));if((rval = recv(msgsock, buf, sizeof(buf),0)< 0))perror(”reading stream message“);if(rval == 0)
printf(”%sn“, buf);} } closesocket(msgsock);} while(TRUE);closesocket(msgsock);
客戶端:
#include ”stdafx.h“ #include
for(i=0;i<=1000;i++)//循環控制 { memset(buf, 0, 1024);scanf(”%s“,&buf);rval = send(fd, buf, strlen(buf)+ 1,0);if(rval < 0)printf(”Write error!“);} } closesocket(fd);exit(5);} return 0;
b.給出程序調試和運行的截圖。
c.回答下列問題:
(1)為什么在服務器和客戶端要包含winsock2.h文件?
答:用Winsock2 API,這樣有助于對異步、非阻塞Socket編程機制的理解。為了簡單起見,服務器端和客戶端的應用程序均是基于MFC的標準對話框,網絡通信部分基于Winsock2 API實現。
(2)為什么在服務器和客戶端程序中要加入#pragma comment(lib,”ws2_32.lib")語句,如果不加會出現什么問題?
答:用該語句,指示編譯當前單元時,linker會優先鏈接該preproccessor 指定的lib文件,這樣等于就告訴編譯器有這樣一個lib文件可以去鏈接。如果不加就會出現類似“LNK2019: 無法解析的外部符號__imp__closesocket@4,該符號在函數_wmain 中被引用”的錯誤。
(3)為什么在服務器和客戶端程序中要使用WSAStartup函數,如果不用程序會有什么問題?
答:使用Winsock庫函數之前,必須先調用函數WSAStartup,該函數負責初始化動態連接庫Ws2_32.dll.若ws2_32.dll尚未初始化,是無法調用WSAGetLastError.WSAStartup是任何使用Winsock的應用程序或者 DLL首先必須調用Winsock庫函數.一方面它初始化 ws2_32.dll,另一方面他用于在應該程序DLL與系統Winsock庫版本協商。所以,如果不用該函數程序將無法按照正常的情況進行。
(4)如果程序在Turbo C環境下運行,在服務器和客戶程序中還需要上面的內容嗎?
答:不需要。
(5)如果服務器程序中沒有memset(server.sin_zero, 0,sizeof(server.sin_zero));語句,程序會出現什么錯誤,為什么?
答:此函數是為新申請的內存做初始化工作。如果去掉該語句在理論上面應該有錯誤,但是在我的實際操作中卻沒有錯誤,這個問題在我將繼續深究。
(6)如果先運行客戶端程序,程序會有什么現象,為什么會有這一現象?
答:無法連接。因為如果先運行客戶端的話,沒有服務器端等待,那么服務器端艱苦肯定無法給予響應,所以也就無法連接。
(7)如果服務器程序所在計算機沒有連接網絡,程序會發生什么錯誤?我們捕獲到什么錯誤信息?
答:無法連接。會出現報錯。
(8)上述服務器是串行處理多個客戶端的請求,如何該成并發處理的服務器?
答:用父進程調用accept,然后調用fork,這樣,已連接套接口就在父進程與子進程間共享,一般來說,接下來便是子進程讀、寫已連接套接口并關閉偵聽套接口,而父進程則關閉已連接套接口。
5.實驗環境:提供的Socket程序在visual c++ 2008中的設置(1)創建工程
(2)在應用程序開發中選擇預編譯頭
(3)源程序有如下改變,winsock2.h windows.h頭文件順序要改變
#include
第三篇:計算機網絡實驗三報告
實驗三 交換機配置
一、實驗目的
1、掌握交換機在網絡中的作用及交換機設備的選型。
2、掌握交換機的工作原理。
3、掌握利用超級終端對交換機配置的過程。
4、掌握Cisco2950交換機的基本配置方法,了解各交換機配置命令的作用。
二、實驗屬性
驗證性實驗。
三、實驗儀器設備及器材 硬件環境:Cisco 2950交換機、Windows操作系統的PC機,有關連接線。2 軟件環境 Windows xp操作系統,Packet Tracer 5仿真軟件
四、實驗要求
1、熟練掌握Cisco交換機基本配置命令及各命令的作用。
2、試驗中正確使用儀器設備,獨立操作。
3、試驗后按規定要求寫出實驗報告。
五、實驗內容和步驟
1、終端控制臺(console口)的連接和配置 PC機作為控制終端使用,用翻轉線連接PC機的串口與交換機的console口,Pcaket Tracer仿真軟件中實驗圖如圖1,可以多連接幾臺PC機,其中連線選用console,連接PC機的RS232接口。
圖1 Pcaket Tracer仿真實驗圖
(1)“開始”菜單“程序”→“附件”→“通信”→“超級終端”打開超級終端。(2)新建連接,選擇PC機使用的串口(本實驗為COM1),并將該串口設置為波特率9600波特、數據位8位、奇偶校驗位無、停止位1位、數據流控制無。或者直接點擊“還原為默認值”即可;如圖2所示。
圖2 com1屬性對話框 圖3 超級終端登陸界面
以上兩步在packet tracer軟件操作為:鼠標點擊PC,然后選擇“Desktop”,再點擊tenminal。(3)進入超級終端程序后,單擊“回車”鍵,系統將收到交換機的回送信息,如圖3。
2、交換機配置模式及幫助
交換機配置模式是用于不同級別的命令對交換機進行配置,同時提供了一定的安全性、規范性。
3、交換機工作模式切換
(1)登陸交換機,進入用戶模式。連接交換機并且登陸。請注意現在交換機上的顯示符號。顯示如下:Switch>
(2)使用命令(?)查看在用戶模式下所支持的命令。
Exec commands: <1-99> Session number to resume connect Open a terminal connection disconnect Disconnect an existing network connection enable Turn on privileged commands exit Exit from the EXEC logout Exit from the EXEC ping Send echo messages resume Resume an active network connection show Show running system information telnet Open a telnet connection terminal Set terminal line parameters traceroute Trace route to destination(3)進入特權模式,輸入(enable)。如果交換機有密碼保護那么此時需要輸入確認密碼。注意現在的提示符和用戶模式的差別,Switch#(4)使用命令(?)查看在特權模式下所支持的命令,注意和用戶模式下的區別。
Exec commands: <1-99> Session number to resume clear Reset functions clock Manage the system clock configure Enter configuration mode connect Open a terminal connection copy Copy from one file to another debug Debugging functions(see also 'undebug')delete Delete a file dir List files on a filesystem disable Turn off privileged commands disconnect Disconnect an existing network connection enable Turn on privileged commands erase Erase a filesystem exit Exit from the EXEC logout Exit from the EXEC more Display the contents of a file no Disable debugging informations ping Send echo messages 2 reload Halt and perform a cold restart resume Resume an active network connection setup Run the SETUP command facility(5)進入全局配置模式,輸入命令(configure terminal 或 config t)。提示符顯示如下:Switch(config)#(6)使用命令(?)查看在全局配置模式下所支持的配置命令。
Configure commands: banner Define a login banner boot Boot Commands cdp Global CDP configuration subcommands clock Configure time-of-day clock do To run exec commands in config mode enable Modify enable password parameters end Exit from configure mode exit Exit from configure mode hostname Set system's network name interface Select an interface to configure ip Global IP configuration subcommands line Configure a terminal line mac-address-table Configure the MAC address table no Negate a command or set its defaults service Modify use of network based services spanning-tree Spanning Tree Subsystem username Establish User Name Authentication vlan Vlan commands vtp Configure global VTP state(7)退出全局配置模式,使用快捷鍵(Ctrl+Z)退出全局配置模式,進入特權模式。也可以使用命令(exit)退出全局配置模式。
(8)退出特權模式,使用命令(disable)從特權模式會到用戶模式。
(9)退出交換機,使用命令(exit)退出交換機。這個命令可以用來從特權模式中退出交換機。
4、交換機名稱、口令設置
(1)通過超級終端進入交換機,并進入全局模式,鍵入命令:
Switch(config)#hostname switch2950 Switch2950(config)# 交換機的命令提示行的名稱由Switch更改為Switch2950。
(2)全局模式下,設定明文口令cisco,此口令可以限制對特權模式的訪問。在配置文件中可以看見口令。
Switch2950(config)#enable password cisco(3)全局模式下,設定加密口令Cisco,此口令可以限制對特權模式的訪問。
Switch2950(config)#enable secret cisco(4)接口模式下,設定控制臺終端的登陸口令為cisco。
Switch2950(config)#line console 0 //進入接口模式 Switch2950(config-line)#login //會提示設置密碼
Switch2950(config-line)#password cisco(5)接口模式下,設定遠程登陸口令為cisco Switch2950(config)#line vty 0 4 Switch2950(config)#login Switch2950(config)#password cisco 注:vty 0 4 是5個不同的虛擬終端連接。
(6)以上口令設置中,除了enable secret設置加密口令外,其余均可通過show run命令在配置文件中查看。可以通過全局命令將明文口令加密。
Switch2950(config)#service password-encryption(7)交換機命令歷史,Cisco交換機會保存輸入過的命令,并可以對保存的命令的個數進行設置,同時可以再次通過快捷方式進行使用,這在再次輸入很長或很復雜的命令時很有用。缺省情況下,系統會保存10條命令,最大可以設置256條命令。
設置命令行數為100 Switch2950#terminal history size 100(8)任何時候可以使用show running-config命令查看命令配置,可以在特權模式下使用copy running-config startup-config命令保存配置。
5、交換機VLAN設定
(1)在Cisco 2950上定義三個VLAN,分別取名為engineer , account, manager;Switch#vlan database VLAN 3 added: Name: engineer Switch(vlan)#vlan 4 name account VLAN 4 added: Name: account Switch(vlan)#vlan 5 name manager VLAN 5 added: Name: manager Switch(vlan)#apply
//進入vlan配置模式,database為虛擬局域網編號
Switch(vlan)#vlan 3 name engineer //定義vlan名稱及vlan號
(2)將端口12-15 加入到engineer 當中,端口16-18 加入到account 當中,端口24 加入到manager 當中。
Switch(config)#interface range fastEthernet 0/12 – 15 //將端口12-15加入到vlan中
Switch(config-if-range)#switchport mode access Switch(config-if-range)#switchport access vlan 3 Switch(config-if-range)#interface range fastethernet 0/16-18 Switch(config-if-range)#switchport mode access Switch(config-if-range)#switchport access vlan 4 Switch(config)#interface fastethernet 0/24 //將一個端口加入到vlan中,單端口模式 Switch(config-if)#switchport mode access Switch(config-if)#switchport access vlan 5(3)返回到特權模式,用 show vlan查看vlan情況。
第四篇:數據庫原理實驗三
數據庫原理及應用實驗報告
實驗名稱:存儲過程 實驗類型:驗證型 實驗環境:oracle 11g 指導教師:陳 駿 專業班級:信安1505班 姓
名:
學
號:512015 聯系電話:電子郵件: 實驗地點:東6E501 實 驗 日 期: 2017年5月10日 實驗報告日期:2017年 5月 11日
成績:__________________________
一、實驗目的
(1)了解存儲過程的概念、優點
(2)熟練掌握創建存儲過程的創建方法(3)熟練掌握存儲過程的調用方法
二、實驗平臺
Oracle 11g
三、實驗步驟、出現的問題及解決方案(不能解決的將問題列出)(1)實驗步驟
1)建立存儲過程完成圖書管理系統中的借書功能。
功能要求:
? 借書時要求輸入借閱流水號,借書證號,圖書編號。(即該存儲過程有3個輸入參數)
? 借書時,借書日期為系統時間。? 圖書的是否借出改為‘是’
2)建立存儲過程完成圖書管理系統中的預約功能。? 預約時要求輸入預約流水號,借書證號,ISBN。(即該存儲過程有3個輸入參數)
? 存儲過程先檢查輸入的ISBN版本的圖書是否都已借出,如果是則進行預約,否則提示“該書目有可借圖書,請查找”。? 預約時間為系統時間。
3)建立存儲過程完成圖書管理系統中的還書功能。
? 還書時要求輸入借書證號,圖書編號,罰款分類號(即該存儲過程有3個輸入參數)。
? 還書日期為系統時間。? 圖書的是否借出改為‘否’。
(2)問題及解決方案
1)問題一:步驟一無法執行
原因:已創建的table中無“借書”項
解決方案:將原代碼中的“借書”改為“借閱” 2)問題二:步驟二中出現無法識別的符號 原因:將英文分號誤寫為中文分號
解決方案:修正為英文分號“;”
四、思考與總結
(1)書寫存儲語句時,應注意涉及的表格和屬性名應與創建表格時相同(2)注意區分中英文符號,避免出現符號無法識別以及程序沒有結尾等錯誤(3)注意空格的使用,避免出現缺少或多余的空格,造成語法錯誤
五、附:實驗完整源代碼
1、CREATE OR REPLACE PROCEDURE PRO_借書功能(VAL_借閱流水號 IN 借閱.借閱流水號%TYPE, VAL_借書證號 IN 借閱.借書證號%TYPE, VAL_圖書編號 IN 借閱.圖書編號%TYPE)AS BEGIN INSERT INTO 借閱(借閱流水號,借書證號,圖書編號,借書日期)VALUES(VAL_借閱流水號,VAL_借書證號,VAL_圖書編號,TO_CHAR(SYSDATE(),'YYYY/MM/DD'));UPDATE 圖書 SET 是否借出='是' WHERE 圖書.圖書編號 =VAL_圖書編號;DBMS_OUTPUT.PUT_LINE(' 本次借書操作完成!');END;
2、CREATE OR REPLACE PROCEDURE PRO_預約功能(Y_預約流水號 IN 預約.預約流水號%TYPE, Y_借書證號 IN 預約.借書證號%TYPE, Y_ISBN IN 圖書.ISBN%TYPE)AS Y_NUMBER BINARY_INTEGER;BEGIN SELECT COUNT(*)INTO Y_NUMBER FROM 圖書 WHERE 圖書.ISBN=Y_ISBN AND 圖書.是否借出='否';IF Y_NUMBER=0 THEN INSERT INTO 預約(預約流水號,借書證號,ISBN,預約時間)VALUES(Y_預約流水號,Y_借書證號,Y_ISBN,TO_CHAR(SYSDATE(),'YYYY/MM/DD'));DBMS_OUTPUT.put_line('可執行預約!');ELSE DBMS_OUTPUT.put_line('該書可借,請查找!');END IF;END;
3、CREATE OR REPLACE PROCEDURE PRO_還書功能(VAL_借書證號 IN 借閱.借書證號%TYPE, VAL_圖書編號 IN 借閱.圖書編號%TYPE, 4 VAL_罰款分類號 IN 借閱.罰款分類號%TYPE)AS VAL_TIME DATE;BEGIN SELECT SYSDATE INTO VAL_TIME FROM DUAL;UPDATE 借閱 SET 歸還日期=VAL_TIME WHERE 借書證號 =VAL_借書證號 AND 借閱.圖書編號=VAL_圖書編號;UPDATE 圖書 SET 是否借出='否' WHERE 圖書.圖書編號 =VAL_圖書編號;UPDATE 借閱 SET 罰款分類號=VAL_罰款分類號 WHERE 借書證號 =VAL_借書證號 AND 借閱.圖書編號=VAL_圖書編號;DBMS_OUTPUT.PUT_LINE(' 本次還書操作完成!END;
');
數據庫原理及應用實驗報告
實驗名稱:觸發器 實驗類型:驗證型 實驗環境:oracle 11g 指導教師:陳 駿 專業班級:信安1505班 姓
名:李 維 學
號:5120155364 聯系電話:*** 電子郵件: 實驗地點:東6E501 實 驗 日 期: 2017年5月10日實驗報告日期:2017年 5月 10日
成績:__________________________
一、實驗目的
(1)了解觸發器的概念、優點(2)掌握觸發器的方法和步驟(3)掌握觸發器的使用
四、實驗平臺
Oracle 11g
五、實驗步驟、出現的問題及解決方案(不能解決的將問題列出)(3)實驗步驟
1)通過序列和觸發器實現借閱表中借閱流水號字段的自動遞增。
2)通過序列和觸發器實現預約表中預約流水號字段的自動遞增
3)修改實驗三借書功能的存儲過程。
該存儲過程要求: ? 借書時輸入借書證號,圖書編號。(即該函數有2個輸入參數)
? 借書時,借書日期為系統時間。
*該存儲過程主體部分只有insert into語句。
4)建立與借書存儲過程相對應的觸發器,當借閱表中加入借閱信息時,該觸發器觸發,自動修改所借圖書的是否借出改為‘是’。
5)修改實驗三還書功能的存儲過程。
該存儲過程要求:
? 還書時輸入借書證號,圖書編號。(即該函數有2個輸入參數)? 還書時,還書日期為系統時間。
*該存儲過程主體部分只有一條UPDATE語句。
6)建立與還書存儲過程相對應的觸發器,當借閱表中填入還書日期時,該觸發器觸發,自動修改所還圖書的是否借出為‘否’。
2(4)問題及解決方案
1)問題一:步驟一中無法識別“seq_id”標識符 原因:未創建seq_id序列 解決方案:先創建該序列
2)問題二:步驟3無法執行
原因:已創建的table中無“借書”項
解決方案:將原代碼中的“借書”改為“借閱” 3)問題三:步驟二中出現無法識別的符號 原因:將英文分號誤寫為中文分號 解決方案:修正為英文分號“;” 4)問題四:
原因:變量賦值過程中使用了錯誤的賦值語句 解決方案:將bnum改為圖書編號
五、思考與總結
(4)在創建trigger之前應先創建sequence,避免出現序列號無法識別的錯誤(5)書寫存儲語句時,應注意涉及的表格和屬性名應與創建表格時相同(6)注意區分中英文符號,避免出現符號無法識別以及程序沒有結尾等錯誤(7)注意區別where和having的用法
(8)注意空格的使用,避免出現缺少或多余的空格,造成語法錯誤
六、附:實驗源代碼
(1)create sequence seq_借閱 start with 8 increment by 1 nomaxvalue nocycle nocache;create or replace trigger tr_借閱流水號 before insert on 借閱 for each row
begin
select seq_借閱.nextval into :new.借閱流水號 from dual;
end;
(2)create sequence seq_預約 start with 8 increment by 1 nomaxvalue nocycle nocache;create or replace trigger tr_預約流水號 before insert on 預約 for each row
begin
select seq_預約.nextval into :new.預約流水號 from dual;
end;
(3)create or replace procedure p_borrow_book_xg(p_jszh in number,p_tsbh in number)as v_sfjc 圖書.是否借出%type;begin
select 是否借出 into v_sfjc from 圖書 where 圖書編號=p_tsbh;
if v_sfjc='否' then
insert into 借閱(借書證號,圖書編號,借書日期)
values(p_jszh,p_tsbh,to_date(to_char(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD'));
--update 圖書 set 是否借出='是' where 圖書編號=p_tsbh;
commit;
else
dbms_output.put_line('該圖書已經借出!');
end if;end;(4)create or replace trigger tr_借書 before insert on 借閱 for each row
begin
if inserting then
update 圖書 set 是否借出='是' where 圖書編號=:new.圖書編號;
select seq_借閱.nextval into :new.借閱流水號 from dual;
end if;
end;(5)create or replace procedure p_return_圖書(p_借書證號 in number,p_圖書編號 in number)as begin
update 借閱 set 歸還日期=to_date(to_char(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD'),罰款分類號=p_罰款分類號 where 借書證號=p_借書證號 and 圖書編號=p_圖書編號;
update 圖書 set 是否借出='否' where 圖書編號=p_圖書編號;
commit;
end;(6)create or replace trigger tr_還書
after update
on 借閱
for each row begin
if updating then
update 圖書 set 是否借出 = '否' where 圖書編號 = :new.圖書編號;
end if;end;
第五篇:計算機網絡原理實驗三winsock套接字編程實驗報告
實驗
三、WINSOCK套接字編程實驗報告
序號:姓名:學號:成績
1.實驗目的:
用C或JAVA語言編寫客戶端、服務器程序,實現基于TCP或UDP的網絡通信數據傳輸服務,熟悉基于TCP或UDP的Socket編程原理。
2.實驗環境:
建立在TCP/IP 網絡體系結構之上計算機網絡實驗環境。各計算機除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發系統。計算機具備Windows環境中套接字socket 的編程接口功能,可為用戶提供全網范圍的進程通信功能。
3.實驗指導:
參見套接字編程實驗指導
4.實驗步驟
(1)運行指導書中給出的參考程序,分析實驗結果,并回答問題(1)-(3)
(2)根據給定參考程序修改代碼,完善修改服務器和客戶端的功能。并回答問題(4)-(5)
5.實驗結果分析
(1)為什么在服務器和客戶端要包含winsock2.h文件?
(2)為什么在服務器和客戶端程序中要加入#pragma comment(lib,“ws2_32.lib”)
語句,如果不加會出現什么問題?
(3)為什么在服務器和客戶端程序中要使用WSAStartup函數,如果不用,程序會有
什么問題?
(4)修改后的程序完成實現了什么功能,附上修改后的源代碼。(修改或填加的代
碼用波浪線標注,并填加注釋),并附上實驗截圖
(5)請詳細說明此實驗在設計及運行時遇到的問題和解決辦法,及實驗體會及建議。