版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、& rf * 4 itCHANG SHU INSTITUTE OF TECHNOLOGY網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)課程結(jié)業(yè)設(shè)計(jì)課題名稱:并發(fā)服務(wù)器編程組 長:丁成園組 員:曹日勻鑫,周峰江學(xué) 院:計(jì)算機(jī)科學(xué)與工程學(xué)院專 業(yè):08網(wǎng)絡(luò)工程(1)班學(xué) 號: 090208124指導(dǎo)教師:李克清提交日期: 2011/6/23i目錄1. 弓I言32. 分析過程32.1基本原理32.2總體框架33. 開發(fā)過程43.1主要模塊的詳細(xì)設(shè)計(jì) 53.11 53.12 53.13 53.2運(yùn)行54. 測試過程95. 實(shí)驗(yàn)小結(jié)9附錄1主要代碼111.1服務(wù)器主要代碼 111.2客戶端主要代碼 172使用說明書2223基
2、于C#勺聊天系統(tǒng)1. 引言隨著現(xiàn)在技術(shù)的不斷輸入和信息化得廣泛普及,網(wǎng)絡(luò)作為一種新興事物,在近些年得 到了前所未有的普及和深入,網(wǎng)絡(luò)上的各種應(yīng)用層出不窮,在各個階層、各個年齡段得用戶提供了不同的個性化的服務(wù)。而現(xiàn)代中小型企業(yè)的領(lǐng)導(dǎo)認(rèn)識到進(jìn)一步提高企業(yè)信息化的必要 性。為使企業(yè)能在瞬間萬變的信息時代生存下去,適應(yīng)激烈的市場競爭,現(xiàn)在企業(yè)要求正加員工之間的交流和通信能力,尤其是領(lǐng)導(dǎo)和員工之間的共同能力,實(shí)時的交流系統(tǒng)就是在這種條件下誕生的。系統(tǒng)開發(fā)時一個十分復(fù)雜的系統(tǒng)工程。這里對系統(tǒng)開發(fā)的基本過程和方法進(jìn)行介紹,列出相關(guān)的文檔示例加以說明。網(wǎng)絡(luò)通信時網(wǎng)絡(luò)應(yīng)用的重要體現(xiàn)方面。網(wǎng)上即時通信則是網(wǎng)絡(luò)應(yīng)用
3、的重要體現(xiàn)方面。 本聊天系統(tǒng)主要應(yīng)用于小型企業(yè),學(xué)校或小型局域網(wǎng)內(nèi)部使用。本應(yīng)用程序使短距離交流更加快捷和方便。更能高效率的體現(xiàn)現(xiàn)代即時通信的特點(diǎn)。2. 分析過程2.1基本原理2.1.1服務(wù)器端服務(wù)器啟動后,將一直監(jiān)聽制定的端口。 看是否有客戶端發(fā)來請求??蛻舳巳绻c服 務(wù)器端建立連接,當(dāng)客戶端進(jìn)行登錄時,要向服務(wù)器端發(fā)送請求,將客戶端的本地IP和端口號發(fā)送給服務(wù)器當(dāng)服務(wù)器端接受到客戶端發(fā)送來的請求后,會將客戶端的資料儲存在一個新的集合里,來滿足其功能要求。2.12客戶端當(dāng)客戶端建立于服務(wù)器端的連接后,就可以實(shí)現(xiàn)聊天的功能了。 任何一個客戶端需要跟另一個客戶聯(lián)系時,客戶端會將發(fā)送的內(nèi)容、目標(biāo)
4、地址的IP地址和端口號一起發(fā)送給服務(wù)器,然后服務(wù)器會在 socket對象中掃描出該目的地址并將客戶端發(fā)送的內(nèi)容再轉(zhuǎn)發(fā)給目的 地址。2.13其他細(xì)節(jié)在各個組件和容器中需要有事件處理的地方,比如關(guān)閉對話框,確定和取消等,要事先設(shè)置事件監(jiān)聽,和事件處理。由于允許使用多個客戶端,所以在各個套接字在接發(fā)信息時要用多線程,使接發(fā)信息的類繼承Tread,實(shí)現(xiàn)多線程設(shè)計(jì)。為了不使客戶端和服務(wù)器端的程序代碼過長,把各個類封裝在不同的文件中,并都聲明為公共類(public),這樣可以在同一個包內(nèi)訪問。委托是一個類,它定義了方法的類型,使得可以將方法當(dāng)作另一個方法的 參數(shù)來進(jìn)行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法,
5、可以避免在程序中大量使用 If-Else(Switch)語句,同時使得程序具有更好的可擴(kuò)展性。通過委托,實(shí)現(xiàn)了客戶端能 夠不停地接收服務(wù)器發(fā)送來的信息,使得信息能夠及時顯示。2.2總體框架程序流程圖操作:操作:操作:登錄信息響應(yīng)消息聊天消息 信息提取,判斷信息正確性 信息提取,得到消息接收方 消息接收并顯不' 發(fā)送消息3.開發(fā)過程3.1主要模塊的詳細(xì)設(shè)計(jì)3.11登錄客戶端首先登錄,用戶輸入登錄信息,點(diǎn)擊“登錄”按鈕,如果服務(wù)器沒有開啟,顯示“無法連接”的提示信息,如服務(wù)開啟了,客戶端根據(jù)接收的信息,調(diào)用數(shù)據(jù)庫,查看數(shù)據(jù) 庫中是否存在此信息,如果不存在,顯示出錯信息;信息存在,向服務(wù)器發(fā)
6、送登錄信息,服 務(wù)器接收信息后判斷發(fā)現(xiàn)是登錄信息,于是向數(shù)據(jù)庫寫入信息, 此時寫入的信息中的離線時間為空,客戶端接收信息,同時調(diào)用數(shù)據(jù)庫獲得在線好友信息并回應(yīng)給對應(yīng)的客戶端??蛻舳私邮辗?wù)器發(fā)來的信息,獲得該用戶的在線好友信息,進(jìn)入聊天頁面,同時將在線好友信息顯示到好友列表中顯示。3.12聊天通信客戶端選擇好友,在信息框中輸入聊天信息,點(diǎn)擊“發(fā)送”按鈕時,首先在聊天框顯示 聊天內(nèi)容,同時將信息送往服務(wù)器,服務(wù)器收到信息后,判斷信息類型,是聊天信息,從信 息中提取目的客戶端的賬號信息,根據(jù)賬號信息,調(diào)用數(shù)據(jù)庫,查看與其對應(yīng)的IP地址和端口號,然后將信息重新打包發(fā)送往目的客戶端,目的客戶端收到服務(wù)
7、器發(fā)來信息,根據(jù)源賬號信息,得出對應(yīng)的名稱以便顯示在聊天信息框中,同時將發(fā)送來的信息也一并顯示在聊天信息框中。3.13退出客戶端退出時,向服務(wù)器發(fā)送消息, 服務(wù)器收到信息后, 判斷信息類型,得到是退出消 息,獲取當(dāng)前時間,根據(jù)信息中的賬號跟新數(shù)據(jù)庫,將與此賬號對應(yīng)的且離線時間為空的信息條進(jìn)行更新。3.2運(yùn)行首先打開服務(wù)器客戶端,點(diǎn)擊打開服務(wù)器按鈕,如圖 1所示。圖1服務(wù)器客戶端打開用戶登錄界面,并輸入賬號,密碼,進(jìn)入系統(tǒng)。如圖2所示。當(dāng)用戶111登錄后,會顯示如圖3所示的聊天框,顯示聊天信息和好友列表。好友222登 錄后,用戶111的登錄界面會出現(xiàn)如圖 4所示。圖3用戶111登錄后聊天界面0.
8、好友列表111 i5 Qnlin«!222 13 online!在線好友:頃1口2零退出岌諼信息圖4用戶222登錄后聊天界面這個時候,服務(wù)器會刷新所有在線用戶列表如圖5所示。圖5刷新用戶列表后的服務(wù)器客戶端當(dāng)用戶退出后,會出現(xiàn)與服務(wù)器斷開連接的提示框如圖6所示。/ <好度列衰Ijll is fthUn*!“在In In I 1I ta I 1201122:1 1241 i發(fā)送值息發(fā)送信思222圖6用戶退出界面當(dāng)用戶111向用戶222發(fā)送聊天信息時,用戶 111的聊天界面會顯示如圖 7所示聊天信息, 用戶222接收到用戶111發(fā)出的消息后,在聊天界面會出現(xiàn)如圖8所示聊天信息。圖7
9、用戶111的聊天界面圖8用戶222的聊天界面4.測試過程經(jīng)過對系統(tǒng)的軟、硬件的驗(yàn)收測試系統(tǒng)滿足課題的要求。其中硬件的測試主要包括硬件設(shè)備的清單、啟動運(yùn)行正常與否等。重點(diǎn)是軟件部分的測試, 首先對軟件的功能進(jìn)行測試, 然后再測試其穩(wěn)定性。系統(tǒng)功能測試細(xì)則表序號測試項(xiàng)目功能與指標(biāo)測試方法預(yù)期方法測試結(jié)果1可登陸性用戶可以隨時登陸, 進(jìn)入聊天室按界面提示輸入名稱出現(xiàn)主窗口 和各個菜單 項(xiàng)正確完成2發(fā)出消息給 好友可以出送消息給好友在消息框輸 入消息,并選 擇好友好友收到消 息正確完成3接收到消息用戶能接收到其他好友發(fā)出的消息當(dāng)接收到數(shù)據(jù)時,在窗口顯示顯示接收到 的消息正確完成4登陸后好友 上線提不&
10、#39;在登陸狀態(tài)下,能夠 接收到上線通知啟動多個客戶端,連接到服務(wù)器端其他好友顯 示上線正確完成5.實(shí)驗(yàn)小結(jié)通過這次試驗(yàn),我更加了解了關(guān)于C#編程過程中容易遇到的問題,以及系統(tǒng)的開發(fā)過程和檢測,實(shí)踐性的學(xué)習(xí)并使用了軟件工程中學(xué)習(xí)到的知識,軟件的制作全過程。 通過這次試驗(yàn),讓我受益匪淺。附錄1. 主要代碼1.1服務(wù)器主要代碼(1)變量定義:private TcpListener ServerListener;/private IPEndPoint Serverinfo;/ 存放服務(wù)器的 IP和端口信息private Socket ServerSocket;/服務(wù)端運(yùn)行的 SOCKETServe
11、rSocketprivate Thread ListenThread;/服務(wù)端運(yùn)行的線程 private Thread AcceptThread;private ArrayList ClientsList; /為客戶端建立的 SOCKET 連接(2) “開啟服務(wù)器”Click事件代碼:private void btnOpen_Click( object sender, EventArgs e)(ClientsList = new ArrayList ();/新開一個監(jiān)聽線程ListenThread = new Thread(new ThreadStart(ListenClients);List
12、enThread.Start();this .btnOpen.Enabled = false;this .btnClose.Enabled = true;(3) 監(jiān)聽客戶端:private void ListenClients()(/監(jiān)聽ServerListener = new TcpListener (IPAddress.Parse('"), 8000);ServerListener.Start(10);新開一個socket去接收客戶端while (true)(try(Socket sktAccept = ServerListener.AcceptSoc
13、ket();ServerSocket = sktAccept;AcceptThread = new Thread(new ThreadStart(MassageHandle);AcceptThread.Start();catch (Exception)(4) 信息接收處理: private void MassageHandle()(Socket sktAccept = ServerSocket;Thread tdAccept = AcceptThread;string message = new string 2;byte口 bytes = new byte1024;string uid =&
14、quot;"IPEndPoint ie = (IPEndPoint)sktAccept.RemoteEndPoint;bool bRcvMsg = true;try(while (bRcvMsg)(Byte buffer = new Byte1024;接收子畫面?zhèn)鬟^來的內(nèi)容int rec=sktAccept.Receive(buffer);string msg = Encoding .ASCII.GetString(buffer, 0, rec);message = TransMessage(msg);bytes = Encoding .ASCII.GetBytes(msg.ToCh
15、arArray();uid = message0.Trim().ToString();if (message1 != null)(string name = GetSqlconStr.getName(uid);if (message1.Trim() = "ALL")(全發(fā)送for (int i = 0; i < ClientsList.Count; i+)(SendMsgToClients( CList)ClientsListi, msg);發(fā)送給單個客戶端else(string myid = message1.Trim();IPEndPoint iep = GetS
16、qlconStr.getEndPoint(myid);for (int i = 0; i < ClientsList.Count; i+)(if(IPEndPoint)(CList )ClientsListi).Sockt.RemoteEndPoint).Equals(iep)(SendMsgToClients( CList)ClientsListi, msg); break; else if (message2.ToString() = "LoginIn") (/Invoke改變主機(jī)登錄名單(增加登錄機(jī)到主機(jī)名單List)ChangeLb(uid, true);fo
17、r (int i = 0; i < ClientsList.Count; i+)(SendMsgToClients( CList )ClientsListi, msg);新建一個CList類對象,加入到服務(wù)器的客戶端列表CList client = new CList(message0, sktAccept.RemoteEndPoint, tdAccept, sktAccept);ClientsList.Add(client);給新登錄的客戶端發(fā)送已登錄人的名單string userList = "List|"for (int i = 0; i < this.l
18、bUsers.Items.Count; i+)(userList += lbUsers.Itemsi.ToString() +"|"/buffer = Encoding.ASCII.GetBytes(userList.ToCharArray();給新登錄的客戶端發(fā)送登錄人名單SendMsgToClients(client, userList);SqlConnection coni = newSqlConnection (GetSqlconStr.getConstring();con1.Open();string sqll = "insert into LoginS
19、tatus(UserId,IpAddress,Port,LoginInTime,LoginOutTime) values('" + uid + "','" + ie.Address.ToString() + "','" + ie.Port.ToString() + "','" + DateTime.Now.ToString() + "',null)"SqlCommand cmdl = new SqlCommand(sqll, coni);cm
20、d1.ExecuteNonQuery();con1.Close();退出else if (message2.ToString() = "LoginOut")(SqlConnection con2 = newSqlConnection (GetSqlconStr.getConstring();con2.Open();string sql2 = "update LoginStatus set LoginOutTime='" + DateTime .Now.ToString() + "' where UserId='"
21、; + uid + "' and LoginOutTime is NULL"SqlCommand cmd2 = new SqlCommand (sql2, con2);cmd2.ExecuteNonQuery();con2.Close();SqlConnection con3 = newSqlConnection (GetSqlconStr.getConstring();con3.Open();string sql3 = "update Users set Status=離線'where UserId='" + uid +;Sql
22、Command cmd3 = new SqlCommand (sql3, con3);cmd3.ExecuteNonQuery();con3.Close();ChangeLb(uid, false);int nRemove = 0;for (int i = 0; i < ClientsList.Count; i+)if(CList )ClientsListi).Sockt.RemoteEndPoint.ToString().Equals(sktAccept.RemoteEndPoint.ToString()nRemove = i;bRcvMsg = false;break;sktAcce
23、pt.Close();ClientsList.Remove(ClientsListnRemove);string strSendMsg = nRemove.ToString() + "|" + "LoginOut"for (int i = 0; i < ClientsList.Count; i+) buffer = Encoding .ASCII.GetBytes(strSendMsg);給新登錄的客戶端發(fā)送登錄人名單SendMsgToClients( CList )ClientsListi, strSendMsg);catch (Exceptio
24、n )ListenThread.Abort();ServerSocket.Close();AcceptThread.Abort();(5) 服務(wù)器向客戶端發(fā)送在線好友名單:private void SendMsgToClients( CList client, string Msg)try byte bufferToClient = Encoding .ASCII.GetBytes(Msg.ToCharArray();client.Sockt.Send(bufferToClient);catch (Exception)(finally(delegate void changeLb(string
25、 str, bool bIsAdd);/訪問主線程private void ChangeLb( string str, bool bIsAdd)(/invoke調(diào)用主線程this.Invoke( new changeLb(ChangeLbText), str, bIsAdd); 設(shè)置主線程界面的值private void ChangeLbText( string str, bool bIsAdd)(if (bIsAdd)(lbUsers.Items.Add(str);else(lbUsers.Items.Remove(str);(6) 將收到的信息根據(jù)“ |”分開,以便與判斷信息類型: pri
26、vate string TransMessage( string tmsg)(int sum = 0;string reMessage = new string 3;char list = tmsg.ToCharArray();for (int i = 0; i < list.Length; i+)(if (listi = '|' && sum < 2)(sum = sum + 1;else(reMessagesum += Convert .ToString(listi);return reMessage;(7) 運(yùn)行服務(wù)器時的初始設(shè)置:privat
27、e void Server_Load( object sender, EventArgs e)cmboxStatus.SelectedIndex = 0;this .btnOpen.Enabled = true;this .btnClose.Enabled = false;(8) 信息刷新,以便于及時顯示上線用戶:private void Refresh(string sql, DataGridView dgw)SqlConnection conn = new SqlConnection (GetSqlconStr.getConstring();conn.Open();SqlCommand c
28、md = new SqlCommand(sql, conn);SqlDataAdapter da = new SqlDataAdapter (cmd);DataSet ds = new DataSet("Users");da.Fill(ds);dgw.DataSource = ds.Tables0;conn.Close();(9) 根據(jù)條件選擇顯示對應(yīng)的用戶信息:private void cmboxStatus_SelectedIndexChanged( object sender, EventArgs e)string sql =""if (cmbox
29、Status.SelectedItem.ToString()="在線")sql = "select * from Users where status='在線'"else if (cmboxStatus.SelectedItem.ToString()="離線")sql = "select * from Users where status='離線'"elsesql = "select * from Users"Refresh(sql, dgwDisplay);(1
30、0) “關(guān)閉服務(wù)器” Click事件:private void btnClose_Click( object sender, EventArgs e)OnClosed(e);this.Close();(11)關(guān)閉所有套接字以及線程資源:protected override void OnClosed( EventArgs e)if (ClientsList != null)(for (int i = 0; i < ClientsList.Count; i+)(CList)ClientsListi).Sockt.Close();(CList)ClientsListi).Thread.Abo
31、rt();if (AcceptThread != null)(AcceptThread.Abort();if (ServerSocket != null)(ServerSocket.Close();if (ListenThread != null)(ListenThread.Abort();if (ServerListener != null)(ServerListener.Stop();base.OnClosed(e);1.2客戶端主要代碼登錄窗體(1)變量定義:byte bytes;byte sendmsg;private Socket localsocket;private IPAddr
32、ess serIp;private IPEndPoint iep;string uid;/int i=0;(2) “登錄”按鈕的 Click事件:private void btnLogin_Click( object sender, EventArgs e)(if (txtID.Text = "" | txtPasswd.Text ="")(MessageBox.Show(”登陸不正確!請輸入完整信息!");return; else(SqlConnection con = new SqlConnection(GetSqlStr.getConst
33、ring(); con.Open();string sql = "select * from Users where UserId = '" + txtID.Text.Trim() + "' and Passwd = '" + txtPasswd.Text.Trim() + "'”;SqlCommand cmd = new SqlCommand (sql, con);SqlDataReader dr = cmd.ExecuteReader();if (!dr.Read()(MessageBox.Show(&quo
34、t;信息輸入錯誤!");con.Close();return; else (uid = txtID.Text.ToString();byte口 bytes = new byte65535;string msg = uid + "|" + "|LoginIn”;bytes = Encoding .ASCII.GetBytes(msg.ToCharArray();localsocket = new Socket(AddressFamily .InterNetwork, SocketType .Stream, ProtocolType .Tcp);try(lo
35、calsocket.Connect( IPAddress.Parse('" ),8000);localsocket.Send(bytes);SqlConnection conn = newSqlConnection (GetSqlStr.getConstring();conn.Open();string sql2 = "update Users set Status=在線'where UserId='" + uid +;SqlCommand cmd2 = new SqlCommand (sql2, conn);cmd2.
36、ExecuteNonQuery();conn.Close();UserList ulist = new UserList (localsocket, uid);this.Hide();ulist.Show();catch ( SocketException )(MessageBox.Show("服務(wù)器出現(xiàn)問題,連接服務(wù)器失?。?quot;);return;private void Form1_Load( object sender, EventArgs e)(bytes = new byte1024;sendmsg = new byte1024;聊天框(1)變量定義:定義委托用于跨線
37、程改變接收信息和好友列表的值delegate void ChangeTxtMsg (string str);delegate void changeClb(string str, int nType, int nIndex);private bool mLogIn = false;private Socket Clientsocket;private Thread MsgHandleThread;string uid;byte sendmsg=new byte1024;(2) “發(fā)送消息”按鈕 Click事件:private void btnSendMsg_Click( object send
38、er, EventArgs e)(string msg;int temp = 0;byte sendmsg = new byte1024;changeTxtMsg("我說:n" + txtSendMsg.Text.ToString() + "n");try(if (clbFriendMsg.SelectedItems.Count >= 1) 判斷消息是群發(fā)還是發(fā)送給 指定好友(string friendID = clbFriendMsg.SelectedItem.ToString();msg = uid + "|" + frie
39、ndID + "|" + txtSendMsg.Text.ToString();sendmsg = Encoding .ASCII.GetBytes(msg.ToCharArray();Clientsocket.Send(sendmsg);else(for (int i = 0; i < clbFriendMsg.Items.Count; i+)(if (clbFriendMsg.GetItemChecked(i)(temp+;if (temp = clbFriendMsg.Items.Count)(msg = uid + "|ALL|" + tx
40、tSendMsg.Text.Trim();sendmsg = Encoding .ASCII.GetBytes(msg.ToCharArray();catch(changeTxtMsg(""' + txtSendMsg.Text.ToString() + "'信息發(fā)送失?。");finally(txtSendMsg.Text ="”;(3) 接收信息處理:private void HandleReceivedMsg()(bool bReceive = true;string name, reMsg;/存放信息發(fā)送目標(biāo)好友的信息
41、 while (bReceive)(try(Socket AcReceive = Clientsocket;Byte buff = new Byte2048;int rec=AcReceive.Receive(buff);reMsg = Encoding .ASCII.GetString(buff,0,rec);string UserArrList = reMsg.Split( '|');if (reMsg !="")(string message = TransMessage(reMsg);if(UserArrList0.Equals( "Lis
42、t")(ChangeClb(string.Empty, 0, -1);for (int i = 1; i < UserArrList.Length -1; i+)(ChangeClb(UserArrListi, 1, -1);changeTxtMsg(UserArrListi + " is online!n" );if (message1.Trim() = "" && message2.Equals( "LoginIn") (name = GetSqlStr .getName(message0);ChangeClb(message0, 1, -1);changeTxtMsg(name + "上線了
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行客戶服務(wù)接待制度
- 電力設(shè)施職業(yè)衛(wèi)生應(yīng)急預(yù)案
- 酒店裝修勞務(wù)服務(wù)方案
- 吉林大學(xué)《儀器分析實(shí)驗(yàn)》2021-2022學(xué)年第一學(xué)期期末試卷
- 文化創(chuàng)意產(chǎn)業(yè)大會方案
- 高校中華傳統(tǒng)文化研討活動方案
- 抗震墻體加固實(shí)施方案
- 2024試用合同能連續(xù)簽
- 吉林大學(xué)《人體速寫B(tài)》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林大學(xué)《晶體光學(xué)及光性礦物學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 安全技術(shù)之傳動裝置的防護(hù)措施
- 農(nóng)貿(mào)市場攤位招商方案
- 醫(yī)療設(shè)備采購 投標(biāo)技術(shù)方案 (技術(shù)方案)
- 《化學(xué)課程思政元素》
- 2024繼續(xù)教育《醫(yī)學(xué)科研誠信與醫(yī)學(xué)了研究倫理》答案
- 門診品管圈課件:提高門診治療患者健康教育的滿意度
- 職業(yè)生涯報告六篇
- 作業(yè)本印制服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 上虞凈化工程施工方案范本
- 【語文】寧波市小學(xué)四年級上冊期中試卷
- 遼寧省沈陽市鐵西區(qū)2023-2024學(xué)年七年級上學(xué)期期中地理試題
評論
0/150
提交評論