JAVA-網(wǎng)絡(luò)編程_第1頁(yè)
JAVA-網(wǎng)絡(luò)編程_第2頁(yè)
JAVA-網(wǎng)絡(luò)編程_第3頁(yè)
JAVA-網(wǎng)絡(luò)編程_第4頁(yè)
JAVA-網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 網(wǎng)絡(luò)編程 在JavaJava語(yǔ)言中,可以使用三種方式實(shí)現(xiàn)網(wǎng)絡(luò)編程: (1 1)URLURL編程(獲取URLURL屬性信息) (2 2)SocketSocket編程(基于TCP TCP 的C/SC/S) (3 3)DatagramDatagram編程(UDPUDP)包 -URL類(lèi) -URLconnection類(lèi) -Socket類(lèi) -ServerSocket類(lèi) -DatagramPacket類(lèi) -DatagramSocket類(lèi) -MulticastSocket類(lèi)TCPTCP實(shí)現(xiàn)實(shí)現(xiàn)網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信UDP實(shí)現(xiàn)實(shí)現(xiàn)網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信本章主要內(nèi)容: HTTP概述 URL URLConnection

2、讀寫(xiě) InetAddres類(lèi) Socket DataGramSocket數(shù)據(jù)報(bào) 1.1.統(tǒng)一資源定位器URLURL URL- Uniform Resource Locator URL- Uniform Resource Locator,表示InternetInternet上某一資源的地址。 瀏覽器通過(guò)解析給定的URLURL可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。 2 2URLURL的組成的組成 protocol:/:port_number/file_nameprotocol:/:port_number/file_name 其中:其中:uprotocolprotocol:協(xié)議名,指明獲取資源所使用

3、的傳輸協(xié)議,:協(xié)議名,指明獲取資源所使用的傳輸協(xié)議, 如如httphttp、ftpftp、gophergopher、filefile等。等。uHost_nameHost_name:資源名(:資源名(resourceNameresourceName)所在的主機(jī)。)所在的主機(jī)。uPort_nubmerPort_nubmer:連接時(shí)所使用的通信端口號(hào):連接時(shí)所使用的通信端口號(hào)uFile_nameFile_name:該資源在主機(jī)的完整文件名。:該資源在主機(jī)的完整文件名。 例例1:http:/:80/index.jsp協(xié)議名稱(chēng)協(xié)議名稱(chēng)主機(jī)名主機(jī)名文件文件端口端口ftp:/ygdy8:9104/夏洛特?zé)?/p>

4、夏洛特?zé)?BD.720p.rmvbfile:/D:/kuaipan/documents/https:/ 3基于基于TCP/IP編程的兩個(gè)協(xié)議編程的兩個(gè)協(xié)議 目前在Internet上使用最為廣泛的協(xié)議是TCP/IP協(xié)議 1)TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議傳輸,得協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方在進(jìn)行數(shù)據(jù)傳輸前必須進(jìn)行連接(成對(duì)的兩個(gè)發(fā)送方和接收方在進(jìn)行數(shù)據(jù)傳輸前必須進(jìn)行連接(成對(duì)的兩個(gè)socket之間必須建立連接)。之間必須建立連接)。2)UDP UDP是是User Da

5、tagram Protocol的簡(jiǎn)稱(chēng),是一種無(wú)連接的協(xié)議,每的簡(jiǎn)稱(chēng),是一種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址。個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址。它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。 3.2 InetAddres類(lèi) 類(lèi).InetAddress表示一個(gè) Internet Protocol (IP) 地址。 應(yīng)用程序必須使用方法 getLocalHost, getB

6、yName, 或 getAllByName 來(lái)創(chuàng)建新的 InetAddress 實(shí)例。 例11: InetAddress ia = new InetAddress (); InetAddress ia = InetAddress.getByName(“”); 其他方法其他方法 1) public byte getAddress() 返回返回 InetAddress 對(duì)象的原始對(duì)象的原始 IP 地址。地址。 2) public static InetAddress getAllByName(String) 給定主機(jī)名,確定該主機(jī)的所有給定主機(jī)名,確定該主機(jī)的所有 IP 地址。地址。 3) pub

7、lic static InetAddress getByName(String host) 給定主機(jī)名,確定該主機(jī)的所有給定主機(jī)名,確定該主機(jī)的所有 IP 地址。地址。 4) public String getHostAddress() 返回返回IP 地址串地址串 %d.%d.%d.%d“ 5) public String getHostName() 返回此地址的全限定主機(jī)名。返回此地址的全限定主機(jī)名。 6) public static InetAddress getLocalHost() 返回本地主機(jī)。返回本地主機(jī)。 7) public String toString() 把此把此IP 地址

8、轉(zhuǎn)換為地址轉(zhuǎn)換為 String 類(lèi)型。類(lèi)型。 上述上述1)-4)方法均要拋出方法均要拋出UnknownHostException 異常。異常。例例12: InetAddress 獲取獲取 IP地址地址import .*; public class getip public static void main(String args) throws UnknownHostException InetAddress ad=InetAddress.getByName(localhost);System.out.println(主機(jī)名:主機(jī)名:+ad.getHostName();System.out.p

9、rintln(主機(jī)地址:主機(jī)地址: +ad.getHostAddress();System.out.println(ad.getCanonicalHostName();System.out.println(本地地址:本地地址: +ad.getAddress();System.out.println(本地主機(jī)名:本地主機(jī)名: +ad.getLocalHost(); 圖3.4 InetAddress類(lèi)獲取IP地址 3.3 URL本節(jié)主要內(nèi)容:本節(jié)主要內(nèi)容:URLURL構(gòu)造方法構(gòu)造方法URLURL類(lèi)的其他方法類(lèi)的其他方法URLURL相關(guān)的異常相關(guān)的異常從從URLURL讀取讀取WWWWWW網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)

10、數(shù)據(jù) 1 1)public URL (String spec);public URL (String spec);例例1 1: URL url=new URL(http:/www. ) URL url=new URL(http:/www. ) 2) public URL(URL baseurl, String spec);基地址基地址URL和相對(duì)路徑和相對(duì)路徑例例2:URL net263=new URL (http:/ URL index263=new URL(net263, index.html) 3) public URL(String protocol, String host, Str

11、ing file); 通過(guò)協(xié)議名、主機(jī)名和文件名通過(guò)協(xié)議名、主機(jī)名和文件名例例3:URL u1=new URL(http, , /G. html); 3.3.1 URL3.3.1 URL構(gòu)造方法構(gòu)造方法4) public URL(String protocol,String host, int port, String file);通過(guò)協(xié)議名、主機(jī)名、端口號(hào)和文件名構(gòu)造一個(gè)通過(guò)協(xié)議名、主機(jī)名、端口號(hào)和文件名構(gòu)造一個(gè)URL對(duì)象。對(duì)象。例例4:URL g1=new URL(http, “, 80, “07/1208/16/3v2007j.html);URLURL類(lèi)的每個(gè)構(gòu)造方法在類(lèi)的每個(gè)構(gòu)造方法在

12、URLURL地址殘缺或無(wú)法解釋時(shí),都將拋出地址殘缺或無(wú)法解釋時(shí),都將拋出MalformedURLExceptionMalformedURLException異常。異常。 3.3.2 URL3.3.2 URL類(lèi)的其他方法類(lèi)的其他方法獲取獲取URL對(duì)象屬性的方法對(duì)象屬性的方法:public String getProtocol():獲取該:獲取該URL的協(xié)議名的協(xié)議名public String getHost() :獲取該:獲取該URL的主機(jī)名的主機(jī)名public String getPort() :獲取該:獲取該URL的端口號(hào)的端口號(hào)public String getPath() :獲取該:獲取

13、該URL的文件路徑的文件路徑public String getFile() :獲取該:獲取該URL的文件名的文件名public String getRef() :獲取該:獲取該URL在文件中的相對(duì)位置在文件中的相對(duì)位置public String getQuery() :獲取該:獲取該URL的查詢(xún)名的查詢(xún)名3.3.4 3.3.4 從從URLURL讀取讀取WWWWWW網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)數(shù)據(jù) URLURL類(lèi)定義了類(lèi)定義了openStream()openStream()方法用以讀取方法用以讀取URLURL地址的數(shù)據(jù),其地址的數(shù)據(jù),其定義為定義為: :public final InputStream open

14、Stream() thorws IOException URLJava 程序程序InputStream例例7:從:從URL中讀取數(shù)據(jù)中讀取數(shù)據(jù) URL google = new URL(“http:/); BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream(); String inputLine; while(inputLine=in.readLine() != null) System.out.println(inputLine); in.close(); .圖圖3.2 3.2 從從UR

15、LURL中讀取數(shù)據(jù)的運(yùn)行結(jié)果中讀取數(shù)據(jù)的運(yùn)行結(jié)果URLReader.javaURLReader.java3.4 3.4 基于基于URLConnectionURLConnection的讀寫(xiě)的讀寫(xiě)1.1.URLConnectionURLConnection類(lèi)類(lèi) URLURL的方法的方法openStream()openStream()只能從網(wǎng)絡(luò)上讀取數(shù)據(jù),而只能從網(wǎng)絡(luò)上讀取數(shù)據(jù),而不能寫(xiě)。不能寫(xiě)。 URLConnectionURLConnection是封裝訪問(wèn)遠(yuǎn)程網(wǎng)絡(luò)資源一般方法類(lèi),是封裝訪問(wèn)遠(yuǎn)程網(wǎng)絡(luò)資源一般方法類(lèi),通過(guò)它可以建立與遠(yuǎn)程服務(wù)器的連接,檢查遠(yuǎn)程資源的一通過(guò)它可以建立與遠(yuǎn)程服務(wù)器的連接,

16、檢查遠(yuǎn)程資源的一些屬性。些屬性。 URLURL類(lèi)類(lèi)中的方法中的方法openConnection()openConnection()可以對(duì)可以對(duì)URLURL指指向的網(wǎng)絡(luò)資源進(jìn)行讀寫(xiě)。向的網(wǎng)絡(luò)資源進(jìn)行讀寫(xiě)。public URLConnetion openConnection();public URLConnetion openConnection();作用:嘗試連接作用:嘗試連接URLURL指向的網(wǎng)絡(luò)資源,然后返回封裝了操指向的網(wǎng)絡(luò)資源,然后返回封裝了操作該連接的類(lèi)作該連接的類(lèi).URLC.URLConnection的一個(gè)實(shí)例。的一個(gè)實(shí)例。 例例8: try /先創(chuàng)建一個(gè)先創(chuàng)建一個(gè)URL對(duì)象對(duì)象ur

17、l1 URL url1=new URL(http:/); /創(chuàng)建到創(chuàng)建到url1的一個(gè)連接對(duì)象的一個(gè)連接對(duì)象con URLConnection con=url1.openConnection(); catch(MalformedURLException) catch(IOException) 2URLConnetion類(lèi)中的常用方法類(lèi)中的常用方法 public InputStream getInputStream(); public OutputStream getOutputStrem(); public URl getURL(); 例例9:采用:采用URLConection 從從URL讀取

18、數(shù)據(jù)讀取數(shù)據(jù) String inputLine; System.out.println(gl.getContentLength(); System.out.println(gl.getDate(); System.out.println(gl.getLastModified(); System.out.println(gl.getURL(); System.out.println(gl.toString();圖圖12.3 12.3 從從URLConectionURLConection讀取數(shù)據(jù)的運(yùn)行結(jié)果讀取數(shù)據(jù)的運(yùn)行結(jié)果URLConnectionReader.javaURLConnectionR

19、eader.javaServletServletPOSTPOST信息信息有動(dòng)態(tài)特性的有動(dòng)態(tài)特性的HTMLHTML網(wǎng)頁(yè)網(wǎng)頁(yè)標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)輸出4.4.對(duì)對(duì)RLConnectionRLConnection寫(xiě)寫(xiě)setDoOutput(true), getOutputStream( ) 什么情況下有必要向什么情況下有必要向URLURL寫(xiě)信息呢?寫(xiě)信息呢? - -表單(表單(Form)Form)與與ServletServlet有交互的網(wǎng)頁(yè)有交互的網(wǎng)頁(yè) - -使用使用POSTPOST方式向方式向CGICGI傳送信息傳送信息 例例10:向一個(gè):向一個(gè)URLConnection寫(xiě)寫(xiě) URL url

20、 = new URL(http:/);URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter ( connection.getOutputStream(); out.println(string); out.close(); 3.5 socket3.5 socketnSocketSocket是網(wǎng)絡(luò)程序中最常用的方式,用是網(wǎng)絡(luò)程序中最常用的方式,用于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信的信道。

21、信的信道。nJavaJava語(yǔ)言提供了兩種語(yǔ)言提供了兩種SocketSocket通信方式:通信方式:nTCP SocketTCP SocketnUDP SocketUDP Socket網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)Mailftpfinger20telnet數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)I/O緩沖區(qū)緩沖區(qū)端口端口2123客戶(hù)程序客戶(hù)程序SocketIP,port套接字是套接字是IP與端口的組合與端口的組合,可以可以分辨在分辨在Internet上運(yùn)行的程序上運(yùn)行的程序3.4.1 socket3.4.1 socket通信一般過(guò)程通信一般過(guò)程 SocketSocket通常用來(lái)實(shí)現(xiàn)客戶(hù)通常用來(lái)實(shí)現(xiàn)客戶(hù)/ /服務(wù)器程序。為了讓客戶(hù)服

22、務(wù)器程序。為了讓客戶(hù)機(jī)知道如何與相應(yīng)的服務(wù)進(jìn)程建立通信聯(lián)系,一般機(jī)知道如何與相應(yīng)的服務(wù)進(jìn)程建立通信聯(lián)系,一般系統(tǒng)為一些常用的服務(wù)類(lèi)型分配了默認(rèn)端口號(hào):系統(tǒng)為一些常用的服務(wù)類(lèi)型分配了默認(rèn)端口號(hào): 表表1 1 常用服務(wù)端口號(hào)常用服務(wù)端口號(hào) 服務(wù)類(lèi)型服務(wù)類(lèi)型 端口號(hào)端口號(hào) EchoEcho FTPFTP TELNETTELNET SMTPSMTP FingerFinger HTTPHTTP POP3POP3 7 7 2121 2323 2525 7979 8080 110110 ServerServerSocket(port #)Socket socket = ServerSocket.accept

23、()接收連接接收連接OutputStreamInputStreamClose SocketClientSocket(host, port #)與服務(wù)器建立連接與服務(wù)器建立連接OutputStreamInputStreamClose Socketsocket TCP TCP協(xié)議協(xié)議 SocketSocket通信通信 SocketSocket編程步驟編程步驟應(yīng)用應(yīng)用SocketSocket進(jìn)行網(wǎng)絡(luò)編程,基本結(jié)構(gòu)都是包括下面進(jìn)行網(wǎng)絡(luò)編程,基本結(jié)構(gòu)都是包括下面4 4個(gè)步驟:個(gè)步驟: :(1 1) 創(chuàng)建創(chuàng)建SocketSocket;(2 2) 打開(kāi)連接到打開(kāi)連接到SocketSocket的輸入的輸入/

24、/出流;出流;(3 3) 按照一定的協(xié)議對(duì)按照一定的協(xié)議對(duì)SocketSocket進(jìn)行讀進(jìn)行讀/ /寫(xiě)操作;寫(xiě)操作;(4 4) 關(guān)閉關(guān)閉SocketSocket。3.5.2 .socket3.5.2 .socketjava在包中提供了Socket類(lèi),表示客戶(hù)端創(chuàng)建對(duì)象來(lái)建立與服務(wù)器的連接。1.Socket構(gòu)造方法Socket(String host, int port);Socket(String host, int port, InetAddress , localAddr,int localPort);例例3:Socket client = new Socket(127.0.01., 80

25、); Socket cc=new Socket(“”,80);2.讀/寫(xiě)方法1)public InputStream getInputStream() throws IOException2)public OutputStream getOutputStream() throws IOException 3)public void close(); 功能:關(guān)閉流功能:關(guān)閉流 Java 語(yǔ)言為服務(wù)器端程序設(shè)計(jì)提供了 ServerSocket 類(lèi)。該類(lèi)允許程序綁定一個(gè)端口,等待客戶(hù)端程序請(qǐng)求,然后根據(jù)客戶(hù)端的請(qǐng)求執(zhí)行相應(yīng)操作,并對(duì)請(qǐng)求作出響應(yīng)。 ServerSocket的構(gòu)造方法的構(gòu)造方法 Ser

26、verSocket(int port); 監(jiān)聽(tīng)方法 public Socket accept();功能: 等待客戶(hù)端的連接,在等待客戶(hù)請(qǐng)求的過(guò)程中,方法 accept() 將處于阻塞狀態(tài)(即無(wú)限循環(huán)狀態(tài)),直到接收到連接請(qǐng)求,返回一個(gè)用于連接客戶(hù)端 Socket 的 Socket 實(shí)例。 3.5.3 .ServerSocket3.5.3 .ServerSocket例18:ServerSocket server=null; try server=new ServerSocket(4700); catch(IOException e) System.out.println(can not list

27、en to :+e); Socket socket=null; try while (true) /允許多個(gè)客戶(hù)端連接 socket=server.accept(); /監(jiān)聽(tīng)客戶(hù)端連接, catch(IOException e) System.out.println(Error:+e); 3輸入/輸出程序?qū)ocket的輸入/輸出流進(jìn)行讀/寫(xiě)操作都和對(duì)普通的輸入/輸出流進(jìn)行讀/寫(xiě)基本一樣。InputStream is=socket.getInputStream();OutputStream os=socket.getOutputStream();需要在這兩個(gè)流對(duì)象的基礎(chǔ)上建立易于操作的數(shù)據(jù)流如

28、 DataInputStream、DataOutputStream或PrintStream。例22:DataInputStream in=new DataInputStream(is);DataOutputStream out=new DataOutputStream(os);PrintStream pout=new PrintStream(os);另外為了便于輸出字符或漢字,可以使用下列輸出另外為了便于輸出字符或漢字,可以使用下列輸出/輸入輸入流:流:BufferedReader in=new BufferedReader( new InputStreamReader(is,encoding

29、);BufferedWriter out=new BufferedWriter( new OutputStremWriter(os, encoding);PrintWriter pout=new PrintWriter(new BufferedWriter( new OutputStreamWriter(os, encoding),true);實(shí)例:實(shí)例:服務(wù)器端接受客戶(hù)端的連接服務(wù)器端接受客戶(hù)端的連接, ,打印相關(guān)連接信息打印相關(guān)連接信息客戶(hù)端向服務(wù)器端發(fā)送信息客戶(hù)端向服務(wù)器端發(fā)送信息允許多個(gè)客戶(hù)端連接允許多個(gè)客戶(hù)端連接服務(wù)器和客戶(hù)端互發(fā)單條消息,服務(wù)器和客戶(hù)端互發(fā)單條消息,允許多客戶(hù)端允許

30、多客戶(hù)端聊天工具簡(jiǎn)易版聊天工具簡(jiǎn)易版TCPServer.javaTCPClient.javaTCPServer1.javaTCPClient1.javaTCPServer2.javaTCPClient2.javaTCPServer3.javaTCPClient3.javaTCPServer3e.javaTCPClient3e.java3.6.數(shù)據(jù)報(bào) UDP 編程主要有以下幾個(gè)步驟: (1)創(chuàng)建包括有目的地址的數(shù)據(jù)報(bào)。 (2)創(chuàng)建一個(gè) Socket ,用于發(fā)送或接收數(shù)據(jù)報(bào)。 (3)發(fā)送數(shù)據(jù)報(bào)。 (4)等待服務(wù)器響應(yīng)。 (5)從響應(yīng)數(shù)據(jù)報(bào)中抽取信息并顯示。Java 提供的有關(guān) UDP 編程的類(lèi)有

31、DatagramPacket 類(lèi)和 DatagramSocket 類(lèi)。 3.6.1 DatagramPacket DatagramPacket 類(lèi)表示一個(gè)數(shù)據(jù)報(bào),有兩個(gè)作用: 1)在發(fā)送 UDP 數(shù)據(jù)之前,需要用 DatagramPacket 類(lèi)封裝一個(gè)數(shù)據(jù)報(bào),可以包括發(fā)送的目的地址和端口號(hào); 2)當(dāng)接收到一個(gè) UDP 數(shù)據(jù)報(bào)后,需要用 DatagramPacket 類(lèi)讀取數(shù)據(jù)報(bào)中的各種信息。1.構(gòu)造方法public DatagramPacket(bytebuf,int length);public DatagramPacket(bytebuf,int length, InetAddress address, int port);DatagramPacket packet=new DatagramPacket(buf, 25

溫馨提示

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

評(píng)論

0/150

提交評(píng)論