TCP的客戶端與服務(wù)器編程-課設(shè)報告要點_第1頁
TCP的客戶端與服務(wù)器編程-課設(shè)報告要點_第2頁
TCP的客戶端與服務(wù)器編程-課設(shè)報告要點_第3頁
TCP的客戶端與服務(wù)器編程-課設(shè)報告要點_第4頁
TCP的客戶端與服務(wù)器編程-課設(shè)報告要點_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、沈航北方科技學(xué)院課程設(shè)計說明書課程稱網(wǎng)絡(luò)應(yīng)用開發(fā)實戰(zhàn)系別專業(yè)班級學(xué)號學(xué)生姓名指導(dǎo)教師2015年1月沈陽航空航天大學(xué)北方科技學(xué)院課程設(shè)計報告摘要隨著科技的發(fā)展和社會的不斷進步,我國的科研成果也越來越多。要想在科技 方面走在世界前列,必須要有自己的科研管理方案。由此看來,一種對科研信息管 理行之有效的手段顯得尤為重要,出色的科研信息管理會給整個社會帶來無窮的經(jīng) 濟效益和社會效益。計算機的最大好處在于利用它能夠進行更好的通信。使用計算 機進行通信控制,不僅提高了工作效率,而且大大的提高了其安全性。尤其對于復(fù) 雜的通信與開發(fā),計算機能夠充分發(fā)揮它的優(yōu)越性。關(guān)鍵詞:TCP,服務(wù)器,客戶端2TCP客戶端與

2、服務(wù)器編程楊闊目錄摘 要1緒論11.1 開發(fā)背景11.2 開發(fā)意義11.3 開發(fā)目的21.4 開發(fā)要求22可行性分析32.1 技術(shù)可行性分析 32.2 操作可行性分析32.3 經(jīng)濟可行性分析 .43需求分析54系統(tǒng)設(shè)計64.1 系統(tǒng)結(jié)構(gòu)64.2 執(zhí)行步驟75詳細設(shè)計95.1 模型結(jié)構(gòu)95.2 功能分析95.3 設(shè)計與實現(xiàn)116系統(tǒng)調(diào)試與測試136.1 系統(tǒng)調(diào)試136.2 系統(tǒng)測試137結(jié)論14參考文獻15附錄1用戶手冊16沈陽航空航天大學(xué)北方科技學(xué)院課程設(shè)計報告附錄2-源程序17iii沈陽航空航天大學(xué)北方科技學(xué)院課程設(shè)計報告1緒論隨著科學(xué)技術(shù)的不斷提高,計算機科學(xué)日漸成熟,其強大的功能已被人們

3、深刻認識。它已進入人類社會的各個領(lǐng)域并發(fā)揮著越來越重要的作用。作為計算機應(yīng)用的一部分,使用計算機實現(xiàn)TCP客戶端與服務(wù)器的編程,具有很大的意義。例如,使用方便、可靠性高、保密性好、壽命長、成本低等。這些優(yōu)點能夠極大地提高效率,這是與世界接軌的重要條件。因此要開發(fā)一個TCP客戶端和服務(wù)器程,利用現(xiàn)代化方法進行通信。1.1 開發(fā)背景當今時代是飛速發(fā)展的信息時代,在各行各業(yè)中離不開網(wǎng)絡(luò),這正是計算機被 廣泛應(yīng)用的原因。計算機的最大好處在于利用它能夠進行更好的通信。使用計算機 進行通信控制,不僅提高了工作效率,而且大大的提高了其安全性。尤其對于復(fù)雜 的通信與開發(fā),計算機能夠充分發(fā)揮它的優(yōu)越性。設(shè)計一個

4、TCP的服務(wù)器與客戶端程序,目的是為了更快,更好地使用 TCP網(wǎng)絡(luò)進行上層業(yè)務(wù)開發(fā)。1.2 開發(fā)意義在目前的情形下,從所現(xiàn)有的實際條件出發(fā),利用計算機設(shè)計一個TCP服務(wù)器和客戶端程序,實現(xiàn)客戶端與服務(wù)器的連接通信。為上層業(yè)務(wù)開發(fā)減少負擔(dān),從根 本上做到科學(xué)化、高效率化這一目的。1.3 開發(fā)目的隨著社會的發(fā)展,在信息社會中,信息的獲取、處理、交流和決策都需要高質(zhì)量的計算機軟件來完成。作為計算機應(yīng)用的一部分,使用計算機實現(xiàn)TCP客戶端與服務(wù)器的編程,具有很大的意義。例如使用方便、可靠性高、保密性好、壽命長、 成本低等。這些優(yōu)點能夠極大地提高效率,這是社會進步與國際接軌的表現(xiàn)。設(shè)計一個TCP的服務(wù)器

5、與客戶端程序,目的是為了更快,更好地使用TCP網(wǎng)絡(luò)進行上層 業(yè)務(wù)開發(fā),使TCP編程更加方便。1.4 開發(fā)要求利用流式套接字編寫TCP客戶機和服務(wù)器程序。主要包含的功能如下:服務(wù)器功能:從端口 6000接收客戶發(fā)送來的數(shù)據(jù);只要有客戶請求連接,服務(wù)器就接受連接; 連接成功后,服務(wù)器端顯示客戶的IP地址和端口號,并向請求連接的客戶發(fā)送“I am a server!”信息;如果發(fā)送過程正確完成,顯示所發(fā)送的字節(jié)數(shù)??蛻魴C功能:向服務(wù)器發(fā)出連接請求;連接成功后,接收并顯示從服務(wù)器收到的信息內(nèi)容和 字節(jié)數(shù)。172可行性分析可行性分析(feasibility study ),是世界上普遍采用的一種研究工程

6、項目是否可行 的科學(xué)。它通過各種有效的方法,對工程項目進行分析,從技術(shù)、經(jīng)濟、財務(wù)等方 面加以評價,最終給投資決策者提供是否選擇該項目進行投資的依據(jù)。2.1 技術(shù)可行性分析當今社會計算機已經(jīng)相當普及,人們的日常生活基本離不開它。TCP服務(wù)器和客戶端編程主要實現(xiàn)從端口 6000接收客戶發(fā)送來的數(shù)據(jù),如果有客戶請求連接,服 務(wù)器就接受連接;連接成功后,服務(wù)器端顯示客戶的IP地址和端口號,并向請求連接的客戶發(fā)送“ I am a server!”信息;如果發(fā)送過程正確完成,顯示所發(fā)送的字節(jié)數(shù) 對客戶信息的管理,內(nèi)容并不復(fù)雜。因此制作一個TCP客戶端和服務(wù)器程序是有必要的。綜上所述,科研管理信息系統(tǒng)的開

7、發(fā)從數(shù)據(jù)庫技術(shù)、軟件技術(shù)、硬件技術(shù)方面 均具有可行性。2.2 操作可行性分析根據(jù)要求本系統(tǒng)需要操作界面友好,界面美觀,使用簡單方便,系統(tǒng)穩(wěn)定性好, 安全可靠。本系統(tǒng)是高??蒲泄芾硇畔⑾到y(tǒng),獲取的本機名,用來解析得到本機的 IP地址的;接著就綁定IP地址成功,然后服務(wù)器就處于監(jiān)聽狀態(tài),等待客戶端的連 接。也就是接下來就是TCP/IP的三次握手的操作,該操作成功了服務(wù)器和客戶端就 可以進行通信了。綜合科研管理信息系統(tǒng)的各項簡潔操作,本系統(tǒng)在操作上是可行的。2.3 經(jīng)濟可行性分析硬件方面, 一臺普通的計算機上就可以實現(xiàn)本次編程,一般的 I5雙核四線程 或者AMD的四核CPU,可以滿足要求了。對于復(fù)雜

8、的通信與開發(fā),計算機能夠充 分發(fā)揮它的優(yōu)越性??偟膩碚f,此次編程對電腦要求不會很高,后期運行對系統(tǒng)也 無過高要求。所以,從經(jīng)濟角度來講,開發(fā)本程序是可行的。3需求分析TCP協(xié)議提供的是可靠的、面向連接的傳輸控制協(xié)議,即在傳輸數(shù)據(jù)前要先建立邏輯連接,然后再傳輸數(shù)據(jù),最后釋放連接3個過程。TCP提供端到端、全雙工通信;采用字節(jié)流方式,如果字節(jié)流太長,將其分段;提供緊急數(shù)據(jù)傳送功能。本 次課程設(shè)計的題目是TCP服務(wù)器與客戶端軟件,使用TCP協(xié)議實現(xiàn)客戶端與服務(wù)器 之間的通信。軟件針對局域網(wǎng)內(nèi)部用戶,實現(xiàn)用戶間的即時通信。需要分別實現(xiàn)服 務(wù)器端和客戶端的軟件設(shè)計。TCP要求在發(fā)送數(shù)據(jù)之前必須打開連接。

9、服務(wù)器應(yīng)用程序必須執(zhí)行一個稱作被 動打開(passive open)的操作,以利用一個已知的端口號創(chuàng)建一個鏈接,這是,服 務(wù)器并不是對網(wǎng)絡(luò)進行呼叫,而是偵聽并等待引入的請求。客戶應(yīng)用程序必須執(zhí)行 一個主動打開(active open),為此,它向服務(wù)器應(yīng)用程序發(fā)送一個同步序列號 (SYN) 以標識連接??蛻魬?yīng)用程序可以將動態(tài)端口號作為本地端口使用。服務(wù)器必須向客 戶發(fā)送一個確認(ACK)以及服務(wù)器的序列號(SYN)。隨后,客戶回復(fù)一個 ACK, 這樣就建立了鏈接。4系統(tǒng)設(shè)計系統(tǒng)設(shè)計要回答 怎么做”即如何實現(xiàn)系統(tǒng)說明書規(guī)定的系統(tǒng)功能。在這一階段,要根據(jù)實際的技術(shù)條件,經(jīng)濟條件和社會條件確定系統(tǒng)的

10、實施方案,即系統(tǒng)的物理模型。4.1 系統(tǒng)結(jié)構(gòu)套接字這個術(shù)語并沒有定義某個協(xié)議:它具有兩層含義,但兩者都與一個協(xié)議 相關(guān)。第一個含義是套接字編程 API,它最初由伯克利大學(xué)為 BSDUNIX而創(chuàng)建。BSD 套接字在經(jīng)過修改后被用作 Windows環(huán)境的編程接口(并且被命名為WinSock)。WinSock API 被包裝在 System.Net.sockets 命名空間的.NET類中。WindowsSockets 是一個獨立于協(xié)議的編程接口,用于編寫網(wǎng)絡(luò)應(yīng)用程序。套接字的第二層含義表示 一個用于在進程間進行通信的終端。在 TCP/IP中,每個終端都與一個IP地址和一 個端口號綁定。我們必須對流式

11、套接字和數(shù)據(jù)報套接字這兩種類型進行區(qū)分。流失 套接字用TCP/IP協(xié)議來使用面向連接的通信。使用TCP套接字編程可以實現(xiàn)基于 TCP/IP協(xié)議的面向連接的通信,它分為 服務(wù)器端和客戶端兩部分,其主要實現(xiàn)過程如圖4.1所示。服務(wù)器端HstonQ ,accept)客戶端阻塞直到接收到客戶連接請求建立連接tcp 一次押r*_ rcad()_數(shù)據(jù)諸求數(shù)據(jù)響應(yīng)關(guān)閉連接duseQ圖4.14.2 執(zhí)行步驟服務(wù)器端步驟:使用socket(見【J建套接字;將創(chuàng)建的套接字綁定到指定的地址結(jié)構(gòu);設(shè)置套接字為監(jiān)聽模式,進入被動接受連接狀態(tài); 接受請求,建立連接;讀寫數(shù)據(jù);終止連接。客戶端步驟:創(chuàng)建套接字;與遠程服務(wù)器

12、建立連接;讀/寫數(shù)據(jù);終止連接。5詳細設(shè)計詳細設(shè)計的主要任務(wù)是設(shè)計每個模塊的實現(xiàn)算法、所需的局部數(shù)據(jù)結(jié)構(gòu)。詳細 設(shè)計的目標有兩個:實現(xiàn)模塊功能的算法要邏輯上正確和算法描述要簡明易懂。5.1 模型結(jié)構(gòu)客戶機/服務(wù)器模型,又稱為 Client/Server模型,簡稱C/S架構(gòu)。C/S計算技術(shù) 在信息產(chǎn)業(yè)當中占有重要的地位。這種客戶機/服務(wù)器模型是一種非對稱式編程模式。 該模式的基本思想是把集中在一起的應(yīng)用劃分成為功能不同的兩個部分,分別在不同的計算機上運行,通過它們之間的分工合作來實現(xiàn)一個完整的功能。對于這種模式 而言其中一部分需要作為服務(wù)器,用來響應(yīng)并為客戶提供固定的服務(wù);另一部分則 作為客戶機

13、程序用來向服務(wù)器提出請求或要求某種服務(wù)。在此“服務(wù)器”是指能在 網(wǎng)絡(luò)上提供服務(wù)的任何程序。服務(wù)器接受網(wǎng)絡(luò)上的請求,完成服務(wù)后將結(jié)果返回給 申請者。對于簡單的服務(wù),把每個請求用一個IP數(shù)據(jù)報發(fā)給服務(wù)器,服務(wù)器用另一個數(shù)據(jù)報返回響應(yīng)。嚴格說來,客戶機/服務(wù)器模型并不是從物理分布的角度來定義, 它所體現(xiàn)的是一種網(wǎng)絡(luò)數(shù)據(jù)訪問的實現(xiàn)方式。采用這種結(jié)構(gòu)的系統(tǒng)目前應(yīng)用非常廣 泛。各種網(wǎng)絡(luò)服務(wù)器基本都遵循同樣的算法:創(chuàng)建一個端口(Port),接受從網(wǎng)絡(luò)上來的 客戶服務(wù)請求,完成計算后把結(jié)果返回給客戶,如此反復(fù)。5.2 功能分析服務(wù)器與客戶端的交互過程如圖所示:客戶端服務(wù)器SYN K, ACK J+lACKK+

14、1L socket, bind, listenaccept阻塞SYN RCVDESTABLISHED 4c3鼠返厄socket戰(zhàn)照且塞SYN SENTESTABLISHEDconnect 返回圖5.1建立連接部分stdoul.客戶端服務(wù)器 fgetsIfiShelloCiieni L-.r lie liOCJ .13,14 P) ,SWRiRMMMRARWW WVWWwivWWVWW? i.sender神國sockfd力屏上用一ierver write子進程阻塞與侏斕用遮程返回到 L acceptfil圖5.2等待數(shù)據(jù)傳輸部分客戶端服務(wù)器客盧輸入ml+D.3 H返回MM盛威 返螞唐戶終止冏冷

15、關(guān)閉sockfdFIN_WAIT_2TIME WAITFINMACK M+lFINNACKN + 1圖5.3關(guān)閉連接部分服務(wù)器以K硝應(yīng),向應(yīng)用 程序發(fā)送文件結(jié)束符E0嘴 應(yīng)用程序,在隊列申等待CLOSE WAIT子攜程接收到ECFjead(卜0, 內(nèi)既h殛叵倒子進程王函 數(shù),子進程關(guān)閉套接字. 發(fā)送FIN子迸程終止,向 父進程發(fā)送 $ta電id僖號CLOSED5.3 設(shè)計與實現(xiàn)本程序?qū)崿F(xiàn)一個客戶端基礎(chǔ)類(TCPClientBase)和服務(wù)器端基礎(chǔ)類 (TCPServerBasR ,其中客戶端基礎(chǔ)類有兩種方式,一種是使用于單獨的客戶端的單 元;另一種使用與服務(wù)器端接收一個鏈接后的單元流程圖如圖5

16、.4所示。圖5.4流程圖6系統(tǒng)調(diào)試與測試系統(tǒng)調(diào)試與測試主要是指通過對系統(tǒng)的反復(fù)調(diào)試與測試,找出系統(tǒng)還存在的錯 誤或不足,最后糾正錯誤或不足,期望系統(tǒng)達到最優(yōu)效果。6.1 系統(tǒng)調(diào)試調(diào)試過程主要是運行編制好的程序,然后遇到錯誤后根據(jù)系統(tǒng)的提示,找到相 關(guān)的問題所在。本系統(tǒng)調(diào)試過程中遇到問題、原因和解決方法如下面介紹。出現(xiàn)的問題:字符信息不能正常顯示從程序中讀出來的信息是亂碼,只有數(shù)字讀出來是正常的,而對于字符讀出來 卻都是亂碼。經(jīng)過查詢資料和反復(fù)嘗試,終于能正常顯示。原來是忘記了加上引號, 改正后,顯示正常。6.2 系統(tǒng)測試測試是程序的一種執(zhí)行過程,目的是盡可能發(fā)現(xiàn)并改正被測試程序中的錯誤, 提高

17、程序的可靠性。它是程序生命周期中一項非常重要且非常復(fù)雜的工作,對軟件 可靠性保證具有極其重要的意義。在目前形式化方法和程序正確性證明技術(shù)還無望 成為實用性方法的情況下,軟件測試在將來相當一段時間內(nèi)仍然是軟件可靠性保證 的有效方法。軟件工程的總目標是充分利用有限的人力和物力資源,高效率、高質(zhì) 量地完成軟件開發(fā)項目。不足的測試勢必使軟件帶著一些未揭露的隱藏錯誤投入運 行,這將意味著更大的危險讓用戶承擔(dān)。過度測試則會浪費許多寶貴的資源。到測 試后期,即使找到了錯誤,然而付出了過高的代價。調(diào)試過程主要是運行編制好的程序,然后遇到錯誤后根據(jù)系統(tǒng)的提示,找到相 關(guān)的問題所在。經(jīng)過不斷的努力,本系統(tǒng)調(diào)試過程

18、中遇到的問題終于一一解決。7結(jié)論經(jīng)過將近半個月的設(shè)計與開發(fā),TCP客戶端與服務(wù)器程序基本開發(fā)完畢,其功 能基本符合需求,能夠完成客戶端與服務(wù)器的通信。對于數(shù)據(jù)的一致性的問題也通 過程序進行了有效的解決。系統(tǒng)設(shè)計為整個程序構(gòu)建了骨架,各個功能模塊實現(xiàn)各 個細節(jié)部分。利于使用者在需要之時快速連接服務(wù)器。但是由于課程設(shè)計時間較短, 所以該系統(tǒng)還有許多不盡人意的地方比如通信方式比較單一,用戶界面不夠美觀, 幫助系統(tǒng)不夠完善,出錯處理不夠等多方面問題。這些都有待于進行進一步改善。沈陽航空航天大學(xué)北方科技學(xué)院課程設(shè)計報告參考文獻1龔沛曾,楊志強.C/C+程序設(shè)計教程.高等教育出版社,2004年2譚獻海網(wǎng)絡(luò)

19、編程技術(shù)及應(yīng)用,北京:清華大學(xué)出版社,2006.123吳功宜,董大凡.計算機網(wǎng)絡(luò)高級軟件編程技術(shù),北京:清華大學(xué)出版社,2008.1沈陽航空航天大學(xué)北方科技學(xué)院課程設(shè)計報告附錄1 用戶手冊點擊運行,彈出程序界面,如圖1所示。蜜塞麻乳S魚 連更等TCP朋務(wù)器正在運行一.專器的數(shù)據(jù):口 « a client*;子下數(shù)061連接中EiMgai L端:電23Ml務(wù)器的飄據(jù)二【1 am a client*;主節(jié)數(shù)IE 戶端的教;捌口 »aclient*;字節(jié)數(shù)"6J 。端的數(shù)鼎:口 a SeruerT ;字節(jié)教"5 1格收到服務(wù)器的數(shù)據(jù)Ml am a SerHJ

20、;字節(jié)數(shù)第】 rress any key to cone inue_圖1程序運行界面圖中顯示了 TCP客戶端與服務(wù)器的程序運行界面,接受信息并統(tǒng)計出發(fā)送信 息的字節(jié)數(shù)的情況。20附錄2 源程序主要模塊源代碼清單:# include <stdio.h># include <winsock2.h>#pragma comment(lib, "WS2_32") 鏈接到 WS2_32.lib# define PORT 6000 /此服務(wù)器監(jiān)聽的端口號# define BUFFERLEN 1024 / 數(shù)據(jù)緩沖區(qū)大小void main()通過載入 Winsock

21、庫,來使用 Winsock的相關(guān)函數(shù)WSADA TA wsaData; 用來返回 Winsock庫的詳細信息WORD version = MAKEWORD(2, 2);int ret = WSAStartup(version, &wsaData);if(ret != 0)printf("加載 Winsock 庫錯誤! n");return ;SOCKET sListen;/聲明服務(wù)器端監(jiān)聽套接sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (INVALID_SOCKET=sListen)printf("

22、創(chuàng)建套接字失敗:%dn",WSAGetLastError();return;設(shè)置服務(wù)器端地址struct sockaddr_in addrSrv; addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(PORT);addrSrv.sin_addr.s_addr=inet_addr("");if (SOCKET_ERROR=bind(sListen,(sockaddr *)&addrSrv,sizeof(addrSrv) printf("綁定失敗:%dn",WSAGetLas

23、tError();return;if (SOCKET_ERROR=listen(sListen,5)printf("監(jiān)聽失?。?dn",WSAGetLastError();return;printf(" TCP服務(wù)器正在運行.n n");SOCKET SockConn;sockaddr_in addrClient;/聲明存放來自客戶端的地址int addrlen=sizeof(addrClient);/ 初始化客戶端地址長度char sendBufBUFFERLEN; 用戶發(fā)送緩沖區(qū)char recvBufBUFFERLEN; 用戶接收緩沖區(qū)int se

24、ndlen;發(fā)送數(shù)據(jù)長度int recvlen;/接收數(shù)據(jù)長度SOCKET sockClient;/聲明客戶端套接字/socket(協(xié)議地址族,套接字類型,協(xié)議創(chuàng)建套接字sockClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if ( INV ALID_SOCKET =sockClient)printf("創(chuàng)建套接字失敗:dn",WSAGetLastError();return ;if(SOCKET_ERROR=connect(sockClient,(sockaddr*)&addrSrv,sizeof(addrSrv)p

25、rintf("連接失敗:%dn",WSAGetLastError();return;printf("連接到服務(wù)器n");SockConn=accept(sListen,(sockaddr*)&addrClient,&addrlen);if (INV ALID_SOCKET=SockConn) printf("接受客戶端連接失?。篸n",WSAGetLastError();/ continue;sprintf(sendBuf,"I am a client!");while(true)sendlen=send(sockClient,sendBuf,strlen(sendBuf)+1,0);printf("發(fā)送到服務(wù)器的數(shù)據(jù):%s;字節(jié)數(shù)%dn",sendBuf,sendlen);if (SOCKET_ERROR=sendlen)printf("發(fā)送到服務(wù)器失?。?d n",WSAGetLastError();return;printf("客戶端的連接 IP:%s,端口 :%dn", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_po

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論