




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、TCP/IP與網(wǎng)絡(luò)編程課 程 設(shè) 計 報 告 書題 目: 2 4分游戲 專 業(yè): 學(xué) 號: 學(xué)生姓名: 指導(dǎo)教師: 完成日期: 目錄1 題目與要求11.1 題目11.2 功能11.3描述12 系統(tǒng)概要設(shè)計22.1 實(shí)現(xiàn)環(huán)境22.2 模塊設(shè)計22.2.1 客戶端界面設(shè)計22.2.2 客戶端代碼設(shè)計22.2.3 服務(wù)器界面設(shè)計32.2.4 服務(wù)器代碼設(shè)計33 系統(tǒng)關(guān)鍵代碼43.1 客戶端代碼43.1.1 連接服務(wù)器43.1.2 用戶登錄43.1.3 獲取四個數(shù)字53.1.4 提交表達(dá)式53.1.5 斷開連接53.1.6 查看前十53.1.7 發(fā)送數(shù)據(jù)53.1.8 接收數(shù)據(jù)63.2 服務(wù)器端代碼83
2、.2.1 開始服務(wù)83.2.2 接收客戶端連接93.2.3 接收客戶端數(shù)據(jù)93.2.4添加客戶端信息113.2.5 產(chǎn)生四個隨機(jī)數(shù)113.2.6 計算表達(dá)式123.2.7 篩選前十123.2.8 發(fā)送數(shù)據(jù)133.2.9 發(fā)送給所有客戶端134 程序運(yùn)行結(jié)果145 課程設(shè)計總結(jié)171 題目與要求1.1 題目24分游戲(分服務(wù)器端和客戶端兩部分)1.2 功能游戲后臺運(yùn)行一個服務(wù)器軟件,游戲者通過客戶端程序登陸后,服務(wù)器隨機(jī)產(chǎn)生四個1-9之間的隨機(jī)數(shù)供游戲者使用,游戲者根據(jù)計算得出結(jié)果。若計算出結(jié)果,且在規(guī)定的時間內(nèi),則從客戶端輸入表達(dá)式,服務(wù)器端根據(jù)客戶端的表達(dá)式計算,若正確,軟件提示:“對了”,
3、如果錯了,軟件提示“錯了”,若超時。軟件提示“超時”。服務(wù)器同時記錄并維護(hù)一個游戲玩家的TOP10排行榜,供玩家查詢。1.3描述服務(wù)器端:接收客戶端的命令請求并提供相應(yīng)的服務(wù)??蛻舳耍和瓿捎螒蛉藱C(jī)界界面的設(shè)計,以命令的方式向服務(wù)器請求服務(wù),并顯示相應(yīng)的提示,主要的命令有:1 CONNECT IP地址 端口號指定游戲服務(wù)器的IP地址和端口號,連接到服務(wù)器。響應(yīng):連接成功/失敗。2 LOGIN 用戶名用戶登錄,報告服務(wù)器玩家的名字。響應(yīng):成功/失敗。3 COUNT 表達(dá)式計算用戶輸入的表達(dá)式。響應(yīng):對了/錯了/超時。4 LISTTOP10請求顯示TOP1
4、0排行榜。響應(yīng):顯示TOP10排行榜。5 EXIT退出游戲。2 系統(tǒng)概要設(shè)計2.1 實(shí)現(xiàn)環(huán)境采用基于.NET平臺的c#語言進(jìn)行編寫,分成服務(wù)器端和客戶端兩部分完成本次設(shè)計,基于SOCKET實(shí)現(xiàn)客戶端與服務(wù)器端的連接、交互,使游戲可以正常運(yùn)行。2.2 模塊設(shè)計2.2.1 客戶端界面設(shè)計連接區(qū):輸入服務(wù)器端的地址及其端口,與服務(wù)器建立連接,為客戶端用戶登錄服務(wù)器做準(zhǔn)備。登錄區(qū):輸入客戶端用戶的用戶名,登錄服務(wù)器后才能玩24分游戲與查看積分前十的玩家排行。出題區(qū):用戶點(diǎn)擊產(chǎn)生四個數(shù)按鈕后,客戶端向服務(wù)器發(fā)出獲取數(shù)字的請求,并開始計時。計時區(qū):在用戶點(diǎn)擊產(chǎn)生四個數(shù)按鈕后,計時器開始工作,計時器變?yōu)?時
5、,游戲結(jié)束。查看前十:用戶登錄服務(wù)器后,可查看服務(wù)器端記錄的積分前十的玩家排行。答題區(qū):用戶可以在此提交表達(dá)式給服務(wù)器,用戶當(dāng)前的積分也在此給出,若表達(dá)式結(jié)果為24,則用戶積分加1,否則,減1。2.2.2 客戶端代碼設(shè)計SendMessage :向服務(wù)器發(fā)送數(shù)據(jù)。將string類型消息轉(zhuǎn)換為byte類型后,通過socket套接字向服務(wù)器發(fā)送數(shù)據(jù)。ReceiveMess:接收服務(wù)器的數(shù)據(jù)。將byte類型消息轉(zhuǎn)換為string類型,根據(jù)服務(wù)器返回的消息,判斷是返回的關(guān)于那部分命令的,做出相應(yīng)的操作,比如:返回的關(guān)于用戶請求查看積分排名前十的信息,那么答題區(qū)的listbox中會添加前十的用戶的積分和
6、名字信息。connbtn_Click:連接按鈕的點(diǎn)擊事件。獲取指定服務(wù)器的IP地址和端口,連接服務(wù)器,創(chuàng)建并啟動線程接收服務(wù)器的信息。loginbtn_Click:登錄按鈕的點(diǎn)擊事件。向服務(wù)器發(fā)送登錄請求。getnumbtn_Click:獲取四個隨機(jī)數(shù)按鈕的點(diǎn)擊事件。向服務(wù)器請求四個隨機(jī)數(shù),并開始計時。submitbtn_Click:提交表達(dá)式按鈕的點(diǎn)擊事件。停止計時,并向服務(wù)器提交表達(dá)式。exitbtn_Click:斷開連接按鈕的點(diǎn)擊事件。斷開與服務(wù)器的連接。topbtn_Click:查看排名前十按鈕的點(diǎn)擊事件。向服務(wù)器請求查看前十信息。timer1_Tick:計時器。2.2.3 服務(wù)器界面
7、設(shè)計設(shè)置監(jiān)聽端口:指定服務(wù)器的端口。Listbox:存放出當(dāng)前連接服務(wù)器的客戶端信息。Textbox:存放服務(wù)器發(fā)出的各種信息。2.2.4 服務(wù)器代碼設(shè)計startbtn_Click:開始服務(wù)按鈕的點(diǎn)擊事件。獲取指定的服務(wù)器端口,創(chuàng)建監(jiān)聽套接字,綁定IP地址和端口。創(chuàng)建并啟動一個監(jiān)聽線程。ClientAccept:接收客戶端連接。創(chuàng)建一個套接字與客戶端通信,創(chuàng)建并啟動一個通信線程。RecevieData:接收客戶端信息。將byte類型消息轉(zhuǎn)換為string類型,并根據(jù)信息作出相應(yīng)操作,比如:getnum,服務(wù)器產(chǎn)生四個隨機(jī)數(shù)并返回給客戶端;submit,服務(wù)器計算客戶端提交的表達(dá)式,若結(jié)果為2
8、4,則用戶積分加1并返回給客戶端,否則,積分減1.log:向用戶信息列表中添加用戶信息。gnum:產(chǎn)生四個隨機(jī)數(shù),并將四個數(shù)字以消息的方式發(fā)送給客戶端。sub:計算用戶提交的表達(dá)式,判斷結(jié)果是否為24,并判斷結(jié)果相應(yīng)地修改用戶積分。GetTopTen:通過冒泡法選出排名前十的用戶積分和用戶名,將信息發(fā)送給客戶端。SendToClient:將string類型的信息轉(zhuǎn)換為byte類型發(fā)送給客戶端。stopbtn_Click:停止服務(wù)按鈕的點(diǎn)擊事件。服務(wù)器停止工作。SendtoAll:發(fā)送給所有連接本服務(wù)器的客戶端信息。3 系統(tǒng)關(guān)鍵代碼3.1 客戶端代碼3.1.1 連接服務(wù)器private void
9、 connbtn_Click(object sender, EventArgs e) loginbtn.Enabled = true; connbtn.Enabled = false; exitbtn.Enabled = true; isExit = false; clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); address = IPAddress.Parse(IPtext.Text.Trim();/獲取指定服務(wù)器IP地址 int port = int.Pa
10、rse(dktext.Text.Trim();/獲取指定服務(wù)器端口 IPEndPoint endpoint = new IPEndPoint(address, port);/創(chuàng)建網(wǎng)絡(luò)節(jié)點(diǎn)對象 try clientSocket.Connect(endpoint);/連接服務(wù)器 infolistbox.Items.Add("連接成功"); catch(SocketException ex) infolistbox.Items.Add("錯誤:" + ex.Message); connbtn.Enabled = true; return; SendMessag
11、e("connect,"); Thread threadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); 3.1.2 用戶登錄 private void loginbtn_Click(object sender, EventArgs e) topbtn.Enabled = true; getnumbtn.Enabled = true; loginbtn.Enabled = false; SendMessage
12、("login," + unamtext.Text); Thread threadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); 3.1.3 獲取四個數(shù)字 private void getnumbtn_Click(object sender, EventArgs e) submitbtn.Enabled = true; SendMessage("getnum,"); Thread thr
13、eadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); StartTime = DateTime.Now; count = 500; timelabel.Text = count.ToString(); timer1.Start(); 3.1.4 提交表達(dá)式 private void submitbtn_Click(object sender, EventArgs e) timer1.Stop(); SendMessage(&q
14、uot;submit," + unamtext.Text.ToString() + "," + textBox1.Text.ToString(); 3.1.5 斷開連接 private void exitbtn_Click(object sender, EventArgs e) if (clientSocket != null) SendMessage("exit,"); 3.1.6 查看前十 private void topbtn_Click(object sender, EventArgs e) SendMessage("list
15、topten,"); infolistbox.Items.Clear(); 3.1.7 發(fā)送數(shù)據(jù) private void SendMessage(string mess) try byte data = Encoding.ASCII.GetBytes(mess); clientSocket.Send(data,data.Length,SocketFlags.None); data = null; catch infolistbox.Items.Add("發(fā)送失敗"); 3.1.8 接收數(shù)據(jù) private void ReceiveMess() byte data
16、 = new byte1024; while (isExit = false) int bufLen = 0; try bufLen = clientSocket.Receive(data); if (bufLen = 0) continue; catch(Exception ex) MessageBox.Show("接收錯誤:" +ex.Message); return; string receive_mess = System.Text.Encoding.ASCII.GetString(data); string splitString = new string10;
17、splitString = receive_mess.Split(','); string command = splitString0.ToLower(); switch (command) case "connect": infolistbox.Invoke(new EventHandler(delegate infolistbox.Items.Add("連接服務(wù)器成功"); ); break; case "login": infolistbox.Invoke(new EventHandler(delegate i
18、nfolistbox.Items.Add("用戶登錄成功"); ); jifenlabel.Text = splitString1; break; case "getnum": num1.Text = splitString1; num2.Text = splitString2; num3.Text = splitString3; num4.Text = splitString4; break; case "exit": infolistbox.Invoke(new EventHandler(delegate infolistbox.
19、Items.Add("連接失敗或與服務(wù)器斷開連接"); ); isExit = true; clientSocket.Close(); connbtn.Enabled = true; break; case "stopserver": isExit = true; clientSocket.Close(); Application.Exit(); break; case "submit": jifenlabel.Text = splitString2; break; case "listtop": infolist
20、box.Invoke(new EventHandler(delegate infolistbox.Items.Add(splitString1); ); break; default: infolistbox.Invoke(new EventHandler(delegate infolistbox.Items.Add(receive_mess); ); break; Application.Exit();/退出 3.2 服務(wù)器端代碼3.2.1 開始服務(wù)private void startbtn_Click(object sender, EventArgs e) int port; string
21、 address = null; port = Convert.ToInt32(porttext.Text);/獲取監(jiān)聽端口 string myHostName = Dns.GetHostName();/得到主機(jī)名 /獲取本機(jī)地址 IPHostEntry ipEntry = Dns.GetHostEntry(myHostName); for (int i = 0; i <ipEntry.AddressList.Length; i+) try if (ipEntry.AddressListi.AddressFamily = AddressFamily.InterNetwork) addre
22、ss = ipEntry.AddressListi.ToString(); catch break; /定義一個套接字用于監(jiān)聽客戶端發(fā)來的消息,包含三個參數(shù)(IP4尋址協(xié)議,流式連接,Tcp協(xié)議) serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /將IP地址和端口綁定到網(wǎng)絡(luò)節(jié)點(diǎn)上 IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(address), port); /監(jiān)聽綁定的網(wǎng)絡(luò)節(jié)點(diǎn) serverSock
23、et.Bind(endpoint); /將套接字的監(jiān)聽隊列長度限制為10 serverSocket.Listen(10); /創(chuàng)建一個監(jiān)聽線程 serverThread = new Thread(ClientAccept); serverThread.IsBackground = true; serverThread.Start(); textBox1.AppendText("開始監(jiān)聽客戶端傳來的信息!" + "rn" + address + ":"+ port + "rn"); startbtn.Enabled
24、= false; 3.2.2 接收客戶端連接private void ClientAccept() /接收客戶端連接 Socket clientSocket = null; while (isNormalExit = false) try clientSocket = serverSocket.Accept(); catch(Exception ex) /提示套接字監(jiān)聽異常 MessageBox.Show("listen Error:" + ex.Message); RemoteEndPoint = clientSocket.RemoteEndPoint.ToString(
25、); /客戶端網(wǎng)絡(luò)結(jié)點(diǎn)號 textBox1.AppendText("成功與" + RemoteEndPoint + "建立連接!tn"); /顯示與客戶端連接情況 dic.Add(RemoteEndPoint, clientSocket); /添加客戶端信息 OnlineList_Disp(RemoteEndPoint); /顯示在線客戶端 /IPEndPoint netpoint = clientSocket.RemoteEndPoint as IPEndPoint; /創(chuàng)建一個通信線程 ParameterizedThreadStart pts = n
26、ew ParameterizedThreadStart(RecevieData); Thread thread = new Thread(pts); thread.IsBackground = true; /設(shè)置為后臺線程,隨著主線程退出而退出 thread.Start(RemoteEndPoint); /啟動線程 3.2.3 接收客戶端數(shù)據(jù) private void RecevieData(object remoteEndPoint) /處理接收的客戶端數(shù)據(jù) string RemoteEndPoint = remoteEndPoint.ToString(); Socket clientSoc
27、ket = dicRemoteEndPoint; string receiveString = null; byte buffer = new byte1024*1024; while (isNormalExit = false) try /從網(wǎng)絡(luò)流中讀出字符串,此方法會自動判斷字符串長度前綴,并根據(jù)長度前綴讀出字符串 int bufLen = clientSocket.Receive(buffer); receiveString = System.Text.Encoding.ASCII.GetString(buffer); if (bufLen = 0) continue; /將發(fā)送的字符串
28、信息附加到文本框txtMsg上 Array.Clear(buffer, 0, bufLen); textBox1.AppendText("客戶端:" + clientSocket.RemoteEndPoint + "rn" + receiveString + "rnn"); catch (Exception ex) textBox1.AppendText("客戶端" + "已經(jīng)中斷連接" + "錯誤:" + ex + "rn"); /提示套接字監(jiān)聽異常 l
29、istBox1.Items.Remove(RemoteEndPoint.ToString();/從listbox中移除斷開連接的客戶端 clientSocket.Close();/關(guān)閉之前accept出來的和客戶端進(jìn)行通信的套接字 break; string splitString = receiveString.Split(','); string command = splitString0.ToLower(); /int score; /把收到的字符串按“,”分隔然后賦給splitString switch (command) case "connect&quo
30、t;: textBox1.AppendText(string.Format("來自0", clientSocket.RemoteEndPoint); mess = "connect," SendToClient(RemoteEndPoint, mess); break; case "login": string name = splitString1; textBox1.AppendText(string.Format("該用戶用戶名為0",name); log(name); break; case "g
31、etnum": gnum(); break; case "exit": mess="exit," SendToClient(RemoteEndPoint, mess); listBox1.Items.Remove(clientSocket.RemoteEndPoint.ToString(); dic.Remove(RemoteEndPoint); clientSocket.Close(); break; case "submit": name = splitString1; string expression = split
32、String2; sub(expression, name); break; case "listtopten": GetTopTen(RemoteEndPoint); break; default: textBox1.AppendText(string.Format(receiveString); break; 3.2.4添加客戶端信息 private void log(string name) /添加客戶端信息 score = 0; User client = new User(); client.userName = name; client.scores = 0;
33、user.Add(client); mess = "login," + score + "," SendToClient(RemoteEndPoint, mess); 3.2.5 產(chǎn)生四個隨機(jī)數(shù)private void gnum() Random random = new Random(DateTime.Now.Millisecond); /用當(dāng)前時間的毫秒作隨機(jī)種子產(chǎn)生隨機(jī)數(shù) int num1 = random.Next(1, 9);/產(chǎn)生四個19隨機(jī)數(shù) int num2 = random.Next(1, 9); int num3 = random.N
34、ext(1, 9); int num4 = random.Next(1, 9); mess = "getnum," + num1 + "," + num2 + "," + num3 + "," + num4 + "," SendToClient(RemoteEndPoint, mess); 3.2.6 計算表達(dá)式private void sub(string expression,string name) DataTable eval = new DataTable(); int result
35、= Convert.ToInt32(eval.Compute(expression, ""); if (result = 24) score += 1; mess = "submit,回答正確," + score + "," SendToClient(RemoteEndPoint, mess); else score -= 1; mess = "submit,回答錯誤," + score + "," SendToClient(RemoteEndPoint, mess); 3.2.7 篩選前十 private void GetTopTen(string RemoteEndPoint) User useri = new User(); for (int i = 0; i <
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 品牌建設(shè)及市場推廣合作合同書
- 家用電器召回制度及處置流程操作
- 2024年中國銀化合物行業(yè)市場調(diào)查報告
- 2025年CAP項目安全風(fēng)險評價報告
- 2025年中國蠶養(yǎng)殖行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報告
- 摩托車自動盤項目可行性研究報告方案可用于立項及銀行貸款+201
- 2025年中國功能性食品行市場發(fā)展前景預(yù)測及投資戰(zhàn)略咨詢報告
- 2024-2030年中國家紡電子商務(wù)行業(yè)發(fā)展?jié)摿︻A(yù)測及投資戰(zhàn)略研究報告
- 2020-2025年中國濃香型白酒行業(yè)市場前景預(yù)測及投資方向研究報告
- 中國實(shí)驗(yàn)室研磨機(jī)行業(yè)市場深度分析及投資戰(zhàn)略規(guī)劃報告
- 《水火箭制作》課件
- 網(wǎng)絡(luò)安全預(yù)防電信詐騙主題班會PPT
- 農(nóng)村垃圾清運(yùn)投標(biāo)方案
- 優(yōu)秀物業(yè)管理項目評選方案
- 貴州大方富民村鎮(zhèn)銀行股份有限公司(籌)招聘上岸提分題庫3套【500題帶答案含詳解】
- GB/T 5470-2008塑料沖擊法脆化溫度的測定
- 圖書管理系統(tǒng)畢業(yè)論文參考文獻(xiàn)精選,參考文獻(xiàn)
- 中國當(dāng)代舊體詩選讀幻燈片
- 吉林省全省市縣鄉(xiāng)鎮(zhèn)衛(wèi)生院街道社區(qū)衛(wèi)生服務(wù)中心基本公共衛(wèi)生服務(wù)醫(yī)療機(jī)構(gòu)信息名單目錄995家
- 倔強(qiáng)的小紅軍-精講版課件
- 信息隱藏與數(shù)字水印課件(全)全書教學(xué)教程完整版電子教案最全幻燈片
評論
0/150
提交評論