版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、3.1 TCP簡介簡介3.2 同步同步與異步與異步3.3 C#中的中的TCP編程類編程類3.4 TCP基礎(chǔ)編程的一般步驟基礎(chǔ)編程的一般步驟3.5 同步同步TCP編程編程3.6異步異步TCP編程編程3.7 兩種兩種TCP程序的區(qū)別程序的區(qū)別3.1.1 TCP的工作過程的工作過程1. 連接的建立連接的建立TCP協(xié)議通過三個(gè)報(bào)文段完成類似電話呼叫的連接建立過程,這個(gè)過程稱為三次握手(three-way handshake),如圖3.1所示。2. 傳輸數(shù)據(jù)傳輸數(shù)據(jù)一旦通信雙方建立了TCP連接,連接中的任何一方都能向?qū)Ψ桨l(fā)送數(shù)據(jù)和接收對(duì)方發(fā)來的數(shù)據(jù)。TCP協(xié)議負(fù)責(zé)把用戶數(shù)據(jù)(字節(jié)流)按一定的格式和長度組
2、成多個(gè)數(shù)據(jù)報(bào)進(jìn)行發(fā)送,并在接收到數(shù)據(jù)報(bào)之后按分解順序重新組裝和恢復(fù)用戶數(shù)據(jù)。利用TCP傳輸數(shù)據(jù)時(shí),數(shù)據(jù)是以字節(jié)流的形式進(jìn)行傳輸?shù)摹?. 連接的終止連接的終止建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過四次握手,這是由TCP的半關(guān)閉(half-close)造成的。具體過程如圖3.2所示。TCP最主要的特點(diǎn)如下。(1)是面向連接的協(xié)議。(2)端到端的通信。每個(gè)TCP連接只能有兩個(gè)端點(diǎn),而且只能一對(duì)一通信,不能一點(diǎn)對(duì)多點(diǎn)直接通信。(3)高可靠性。通過TCP連接傳送的數(shù)據(jù),能保證數(shù)據(jù)無差錯(cuò)、不丟失、不重復(fù)地準(zhǔn)確到達(dá)接收方,并且保證各數(shù)據(jù)到達(dá)的順序與其發(fā)出的順序相同。(4)全雙工方式傳輸。(5)數(shù)據(jù)以
3、字節(jié)流的方式傳輸。(6)傳輸?shù)臄?shù)據(jù)無消息邊界。在TCP工作時(shí),底層Socket詳細(xì)的通信流程如圖3.3所示。同步工作方式是指利用TCP編寫的程序執(zhí)行到監(jiān)聽或接收語句時(shí),在未完成工作(偵聽到連接請(qǐng)求或收到對(duì)方發(fā)來的數(shù)據(jù))前不再繼續(xù)往下執(zhí)行,線程處于阻塞狀態(tài),直到該語句完成相應(yīng)的工作后才繼續(xù)執(zhí)行下一條語句。異步工作方式是指程序執(zhí)行到監(jiān)聽或接收語句時(shí),不論工作是否完成,都會(huì)繼續(xù)往下執(zhí)行。3.3.1 TcpListener類類TcpListener類用于監(jiān)聽和接收傳入的連接請(qǐng)求。該類的構(gòu)造函數(shù)常用的有以下兩種重載形式: TcpListener(IPEndPoint iep) TcpListener(I
4、PAddress localAddr, int port)在同步工作方式下,對(duì)應(yīng)有:(1)Start方法。(2)Stop方法。(3)AcceptSocket方法。(4)AcceptTcpClient方法。表3-1列出了TcpListener類的常用方法。方法方法說明說明AcceptSocket從端口處接收一個(gè)連接并賦予它Socket對(duì)象AcceptTcpClient從端口處接收一個(gè)連接并賦予它TcpClient對(duì)象Equals判斷兩個(gè)TcpListener對(duì)象是否相等GetHashCode用作特定類型的哈希函數(shù)GetType得到當(dāng)前實(shí)例類型Pending確定是否有掛起的連接請(qǐng)求Start開始偵
5、聽傳入的連接請(qǐng)求Stop關(guān)閉偵聽器ToString創(chuàng)建TcpListener對(duì)象的字符串表示TcpClient的構(gòu)造函數(shù)有以下4種重載形式。(1)TcpClient( )。該構(gòu)造函數(shù)創(chuàng)建一個(gè)默認(rèn)的TcpClient對(duì)象,并自動(dòng)分配本機(jī)(客戶端)IP地址和端口號(hào)。利用此構(gòu)造函數(shù)創(chuàng)建對(duì)象后,還必須調(diào)用Connect方法與服務(wù)器建立連接。例如:TcpClient tcpClient = new TcpClient();tcpClient.Connect(“”, 51888);(2)TcpClient(AddressFamily family)。構(gòu)造函數(shù)創(chuàng)建的TcpClient對(duì)象也能自動(dòng)分配本機(jī)(客
6、戶端)IP地址和端口號(hào),但是使用AddressFamily枚舉指定使用哪種網(wǎng)絡(luò)協(xié)議。創(chuàng)建該對(duì)象后,必須調(diào)用Connect方法與服務(wù)器建立連接。例如:TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);tcpClient.Connect(“”, 51888);(3)TcpClient(IPEndPoint iep)。如果使用這種方式,必須調(diào)用Connect方法與服務(wù)器建立連接。例如:IPAddress address = Dns.GetHostAddresses (Dns.GetHostName();IPEndPoint
7、 iep = new IPEndPoint (address0, 51888);TcpClient tcpClient = new TcpClient(iep);tcpClient.Connect(“”, 51888);(4)TcpClient(string hostname, int port)。該構(gòu)造函數(shù)會(huì)自動(dòng)分配最合適的本地主機(jī)IP地址和端口號(hào),并對(duì)DNS進(jìn)行解析,然后與遠(yuǎn)程主機(jī)建立連接。例如:TcpClient tcpClient = new TcpClient(“”, 51888);它相當(dāng)于:TcpClient tcpClient = new TcpClient();tcpClien
8、t Connect(“”, 51888);表3-2和表3-3分別列出了TcpClient類的常用屬性和方法。屬性屬性含義含義Client獲取或設(shè)置基礎(chǔ)套接字LingerState獲取或設(shè)置套接字保持連接的時(shí)間NoDelay獲取或設(shè)置一個(gè)值,該值在發(fā)送或接收緩沖區(qū)未滿時(shí)禁用延遲ReceiveBufferSize獲取或設(shè)置Tcp接收緩沖區(qū)的大小ReceiveTimeout獲取或設(shè)置套接字接收數(shù)據(jù)的超時(shí)時(shí)間SendBufferSize獲取或設(shè)置Tcp發(fā)送緩沖區(qū)的大小SendTimeout獲取或設(shè)置套接字發(fā)送數(shù)據(jù)的超時(shí)時(shí)間方法方法含義含義Close釋放TcpClient實(shí)例,而不關(guān)閉基礎(chǔ)連接Conne
9、ct用指定的主機(jī)名和端口號(hào)將客戶端連接到TCP主機(jī)BeginConnect開始一個(gè)對(duì)遠(yuǎn)程主機(jī)連接的異步請(qǐng)求EndConnect異步接受傳入的連接嘗試GetStream獲取能夠發(fā)送和接收數(shù)據(jù)的NetworkStream對(duì)象3.4.1編寫服務(wù)器端程序的一般步驟編寫服務(wù)器端程序的一般步驟使用對(duì)套接字封裝后的類,編寫基于TCP的服務(wù)器端程序的一般步驟如下。(1)創(chuàng)建一個(gè)TcpListener對(duì)象,然后調(diào)用該對(duì)象的Start方法在指定的端口進(jìn)行監(jiān)聽。典型代碼如:/聲明private IPAddress localAddress;/IP地址private const int port = 51888;/端
10、口private TcpListener tcpListener;/監(jiān)聽套接字/初始化IPAddress listenIp = Dns.GetHostAddresses();localAddress = listenIp0;/初始化IP為本地地址/創(chuàng)建TcpListener對(duì)象,開啟監(jiān)聽tcpListener = new TcpListener(localAddress, port);tcpListener.Start();/監(jiān)聽開始(2)在單獨(dú)的線程中,循環(huán)調(diào)用AcceptTcpClient方法接受客戶端的連接請(qǐng)求,從該方法的返回結(jié)果中得到與該客戶端對(duì)應(yīng)的TcpClient對(duì)象,并利用該對(duì)象
11、的GetStream方法得到NetworkStream對(duì)象,然后再利用該對(duì)象得到其他使用更方便的對(duì)象如BinaryReader對(duì)象、BinaryWriter對(duì)象,為進(jìn)一步與對(duì)方通信作準(zhǔn)備。(3)每得到一個(gè)新的TcpClient對(duì)象,就創(chuàng)建一個(gè)與該客戶對(duì)應(yīng)的線程,在線程中與對(duì)應(yīng)的客戶進(jìn)行通信。Thread threadReceive = new Thread(ReceiveMessage);threadReceive.Start();(4)根據(jù)傳送信息的情況確定是否關(guān)閉與客戶的連接。關(guān)閉連接的代碼:if (br != null)br.Close();if (bw != null)bw.Close
12、();if (tcpClient != null)tcpClient.Close();toolStripStatusInfo.Text = 連接斷開!;使用對(duì)套接字封裝后的類,編寫基于TCP的客戶端程序的一般步驟如下。(1)利用TcpClient的構(gòu)造函數(shù)創(chuàng)建一個(gè)TcpClient對(duì)象。private TcpClient tcpClient;tcpClient = new TcpClient();(2)使用Connect方法與服務(wù)器建立連接。tcpClient.Connect(remoteHost.HostName, int.Parse(tbxPort.Text);(3)利用TcpClient
13、對(duì)象的GetStream方法得到網(wǎng)絡(luò)流,然后利用該網(wǎng)絡(luò)流與服務(wù)器進(jìn)行數(shù)據(jù)傳輸。if (tcpClient != null)statusStripInfo.Invoke(shwStatusInfoCallBack, 連接成功!);networkStream = tcpClient.GetStream();br = new BinaryReader(networkStream);bw = new BinaryWriter(networkStream);(4)創(chuàng)建一個(gè)線程監(jiān)聽指定的端口,循環(huán)接收并處理服務(wù)器發(fā)送過來的信息。Thread threadReceive = new Thread(Recei
14、veMessage);threadReceive.Start();(5)完成工作后,向服務(wù)器發(fā)送關(guān)閉信息,并關(guān)閉與服務(wù)器的連接。3.5.1 界面設(shè)計(jì)界面設(shè)計(jì)服務(wù)器與客戶端程序設(shè)計(jì)簡潔清晰風(fēng)格的界面,如圖3.5所示。程序界面上控件的屬性描述見表3-4和表3-5。Name控件類型控件類型功能描述功能描述frmSyncTcpClientForm程序主窗體lstbxMsgViewListBox接收消息顯示tbxSendCountTextBox設(shè)置消息發(fā)送數(shù)tbxReceiveCountTextBox設(shè)置消息接收數(shù)btnClearButton【清空】按鈕btnReceiveButton【接收】按鈕tbx
15、MsgTextBox編輯待發(fā)信息btnSendButton【發(fā)送】按鈕tbxSrvIpTextBox填寫服務(wù)器IPtbxPortTextBox填寫服務(wù)端口btnConnectButton【連接】按鈕btnDisconnectButton【斷開】按鈕toolStripStatusInfoToolStripStatusLabel狀態(tài)欄文本標(biāo)簽toolStripProgressProcToolStripProgressBar狀態(tài)欄進(jìn)度條statusStripInfoStatusStrip狀態(tài)欄Name控件類型控件類型功能描述功能描述frmSyncTcpServerForm程序主窗體lstbxMsgV
16、iewListBox接收消息顯示tbxSendCountTextBox設(shè)置消息發(fā)送數(shù)tbxReceiveCountTextBox設(shè)置消息接收數(shù)btnClearButton【清空】按鈕btnReceiveButton【接收】按鈕tbxMsgTextBox編輯待發(fā)信息btnSendButton【發(fā)送】按鈕btnStartButton【開始偵聽】按鈕btnStopButton【關(guān)閉偵聽】按鈕btnDisconnectButton【斷開】按鈕toolStripStatusInfoToolStripStatusLabel狀態(tài)欄文本標(biāo)簽toolStripProgressProcToolStripProgr
17、essBar狀態(tài)欄進(jìn)度條statusStripInfoStatusStrip狀態(tài)欄表表3-5同步服務(wù)器端界面控件描述同步服務(wù)器端界面控件描述首先聲明4個(gè)委托:ShwMsgforViewCallBack、ShwStatusInfoCallBack、ShwProgressProcCallBack和ResetMsgTxtCallBack,然后將它們的實(shí)例分別綁定到定義好的4個(gè)函數(shù)(回調(diào)方法):ShwMsgforView、ShwStatusInfo、ShwProgressProc和ResetMsgTxt,通過回調(diào)方法間接地執(zhí)行各自對(duì)應(yīng)的界面操作:列表顯示收到的消息、顯示狀態(tài)信息、顯示進(jìn)度和重置待發(fā)送的
18、消息文本。這是編寫“線程安全”的程序時(shí)操作界面控件的普遍方法,整個(gè)程序的完整代碼。與客戶端程序一樣,首先搭建好應(yīng)用委托回調(diào)機(jī)制的框架,整個(gè)程序的完整代碼。運(yùn)行服務(wù)器和客戶端程序,如圖3.6所示。1. 服務(wù)器接受請(qǐng)求(服務(wù)器接受請(qǐng)求(tcpClient = tcpListener.AcceptTcpClient();)單擊服務(wù)器【開始偵聽】按鈕,如圖3.7所示。單擊客戶進(jìn)程【連接】按鈕,向服務(wù)器發(fā)起連接請(qǐng)求,產(chǎn)生的現(xiàn)象如圖3.8所示。2. 接收數(shù)據(jù)(接收數(shù)據(jù)(string rcvMsgStr = br.ReadString();)單擊服務(wù)器【接收】按鈕,如圖3.9所示。設(shè)置客戶端發(fā)送消息數(shù)為5,
19、編輯消息內(nèi)容后,單擊“發(fā)送”按鈕,運(yùn)行效果如圖3.10所示。單擊客戶端【發(fā)送】按鈕,再發(fā)送5條消息,如圖3.11所示。3. 發(fā)送數(shù)據(jù)(發(fā)送數(shù)據(jù)(bw.Write(state.ToString();)在服務(wù)器接收線程未開啟的情況下,從客戶端向服務(wù)器發(fā)消息,如圖3.12所示。客戶端發(fā)送完畢后,服務(wù)器并無反應(yīng)。只有在單擊服務(wù)器【接收】按鈕后,才能看到收到的消息,如圖3.13所示,發(fā)送消息后對(duì)方卻是異步收到的!3.6.1 異步程序設(shè)計(jì)異步程序設(shè)計(jì)1. 基于基于IAsyncResult的異步設(shè)計(jì)模式的異步設(shè)計(jì)模式(1)基本原理?;贗AsyncResult的異步設(shè)計(jì)模式通過前綴分別為“Begin”和“E
20、nd”的兩個(gè)方法實(shí)現(xiàn)開始和結(jié)束異步操作,每個(gè)Begin方法都必須有一個(gè)與其對(duì)應(yīng)的End方法,如BeginAcceptTcpClient和EndAcceptTcpClient方法等。(2)AsyncCallback委托。AsyncCallback委托用于在異步操作完成時(shí)調(diào)用指定的回調(diào)方法。2. 異步異步TCP編程常用方法編程常用方法表3-6列出了TcpListener類、TcpClient類提供的部分異步操作方法。類類方法方法說明說明TcpListenerBeginAcceptTcpClient開始一個(gè)異步操作接受一個(gè)傳入的連接嘗試EndAcceptTcpClient異 步 接 受 傳 入 的
21、連 接 嘗 試 , 并 創(chuàng) 建 新 的TcpClient處理遠(yuǎn)程主機(jī)通信TcpClientBeginConnect開始一個(gè)對(duì)遠(yuǎn)程主機(jī)連接的異步請(qǐng)求EndConnect異步接受傳入的連接嘗試3. 異步方式調(diào)用同步方法異步方式調(diào)用同步方法(1)聲明與要調(diào)用的方法具有相同簽名的委托。下面的代碼說明了如何聲明一個(gè)與要調(diào)用的方法具有相同簽名的委托:private BinaryWriter bw;private delegate void SendMessageDelegate(string sendMessage);private SendMessageDelegate sendMessageDeleg
22、ate;sendMessageDelegate = new SendMessageDelegate(AsyncSndMsg);private void AsyncSndMsg(string sendMessage)trybw.Write(sendMessage);bw.Flush();catch(2)通過輪詢方式檢查異步調(diào)用是否完成。聲明和AsyncSndMsg方法具有相同簽名的委托以后,公共語言運(yùn)行時(shí)就會(huì)自動(dòng)為該委托定義Beginlnvoke方法和Endlnvoke方法。然后就可以異步調(diào)用AsyncSndMsg方法了。調(diào)用Beginlnvoke方法后,該方法會(huì)立即返回IAsyncResult
23、類型的接口,從用戶界面的服務(wù)線程中進(jìn)行異步調(diào)用時(shí),可以利用該接口的IsCompleted屬性來通過輪詢方式檢查異步調(diào)用是否完成。在輪詢過程中,Beginlnvoke方法在ThreadPool中創(chuàng)建的線程會(huì)繼續(xù)執(zhí)行異步方法。例如:private bool needExit;IAsyncResult result = sendMessageDelegate.BeginInvoke(sendMessage, null, null);while (result.IsCompleted = false)if (needExit)break;Thread.Sleep (50);(3)使用Endlnvoke
24、結(jié)束異步調(diào)用。Endlnvoke方法用于檢索異步調(diào)用的結(jié)果,并結(jié)束異步調(diào)用。調(diào)用Beginlnvoke之后,隨時(shí)可以調(diào)用該方法。如果異步調(diào)用尚未完成,則Endlnvoke會(huì)一直阻止調(diào)用線程,直到異步調(diào)用完成。例如,在退出輪詢后,可以直接通過下面的代碼結(jié)束異步調(diào)用:sendMessageDelegate.EndInvoke(result);給這個(gè)程序設(shè)計(jì)與3.5節(jié)程序一模一樣的界面,只在窗體標(biāo)題中注明這是異步程序,如圖3.14所示。程序界面上控件的屬性描述見表3-7和表3-8。Name控件類型控件類型功能描述功能描述frmAsyncTcpClientForm程序主窗體lstbxMsgViewLi
25、stBox接收消息顯示tbxSendCountTextBox設(shè)置消息發(fā)送數(shù)tbxReceiveCountTextBox設(shè)置消息接收數(shù)btnClearButton【清空】按鈕btnReceiveButton【接收】按鈕tbxMsgTextBox編輯待發(fā)信息btnSendButton【發(fā)送】按鈕tbxSrvIpTextBox填寫服務(wù)器IPtbxPortTextBox填寫服務(wù)端口btnConnectButton【連接】按鈕btnDisconnectButton【斷開】按鈕toolStripStatusInfoToolStripStatusLabel狀態(tài)欄文本標(biāo)簽toolStripProgressPr
26、ocToolStripProgressBar狀態(tài)欄進(jìn)度條statusStripInfoStatusStrip狀態(tài)欄Name控件類型控件類型功能描述功能描述frmAsyncTcpServerForm程序主窗體lstbxMsgViewListBox接收消息顯示tbxSendCountTextBox設(shè)置消息發(fā)送數(shù)tbxReceiveCountTextBox設(shè)置消息接收數(shù)btnClearButton【清空】按鈕btnReceiveButton【接收】按鈕tbxMsgTextBox編輯待發(fā)信息btnSendButton【發(fā)送】按鈕btnStartButton【開始偵聽】按鈕btnStopButton【關(guān)
27、閉偵聽】按鈕btnDisconnectButton【斷開】按鈕toolStripStatusInfoToolStripStatusLabel狀態(tài)欄文本標(biāo)簽toolStripProgressProcToolStripProgressBar狀態(tài)欄進(jìn)度條statusStripInfoStatusStrip狀態(tài)欄表表3-8異步服務(wù)器端界面控件描述異步服務(wù)器端界面控件描述首先搭建好應(yīng)用委托回調(diào)機(jī)制的通用框架,聲明4個(gè)委托:ShwMsgforViewCallBack、ShwStatusInfoCallBack、ShwProgressProcCallBack和ResetMsgTxtCallBack,然后將它們的實(shí)例分別綁定到定義好的4個(gè)函數(shù)(回調(diào)方法):ShwMsgforView、ShwStatusInfo、ShwProgressProc和ResetMsgTxt。整個(gè)程序的完整代碼。與客戶端程序一樣,首先搭建好應(yīng)用委托回調(diào)機(jī)制的框架。由于這是異步服務(wù)器端,故如前一樣,要專門定義兩個(gè)異步操作方法AsyncRcvMsg和AsyncSndMsg,分別用來接收和發(fā)送信息,并且事先聲明和實(shí)例化與它們具有相同簽名的委托ReceiveMessageDelegate和SendMessageDel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:健全全過程人民民主制度體系研究
- 課題申報(bào)參考:家校社聯(lián)動(dòng)共育模式對(duì)青少年24h活動(dòng)行為與抑郁癥狀改善的促進(jìn)研究
- 2025年香港離婚協(xié)議書范本離婚后子女監(jiān)護(hù)權(quán)協(xié)議3篇
- 二零二五年影視剪輯師版權(quán)合作協(xié)議3篇
- 二零二五版白酒銷售顧問銷售數(shù)據(jù)分析與報(bào)告合同3篇
- 二零二五版木材廠土地租賃合同與林業(yè)產(chǎn)業(yè)發(fā)展規(guī)劃3篇
- 二零二五版國際IT產(chǎn)品代理銷售協(xié)議2篇
- 2025版小區(qū)公共區(qū)域保潔與綠化維護(hù)承包合同3篇
- 2025年三明貨運(yùn)從業(yè)資格證好考嗎
- 二零二五版供應(yīng)鏈融資高額抵押反擔(dān)保合同3篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測(cè)規(guī)程
- 2024年高考真題-地理(河北卷) 含答案
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 《思想道德與法治》課程教學(xué)大綱
- 封條(標(biāo)準(zhǔn)A4打印封條)
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十章動(dòng)作技能的指導(dǎo)與示范
- 石油天然氣建設(shè)工程交工技術(shù)文件編制規(guī)范(SYT68822023年)交工技術(shù)文件表格儀表自動(dòng)化安裝工程
- 中醫(yī)治療“濕疹”醫(yī)案72例
- 2023年大學(xué)生《思想道德與法治》考試題庫附答案(712題)
- 清代文學(xué)緒論
評(píng)論
0/150
提交評(píng)論