




版權(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 實現(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ù)。客戶端:完成游戲人機(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 實現(xiàn)環(huán)境采用基于.NET平臺的c#語言進(jìn)行編寫,分成服務(wù)器端和客戶端兩部分完成本次設(shè)計,基于SOCKET實現(xiàn)客戶端與服務(wù)器端的連接、交互,使游戲可以正常運(yùn)行。2.2 模塊設(shè)計2.2.1 客戶端界面設(shè)計連接區(qū):輸入服務(wù)器端的地址及其端口,與服務(wù)器建立連接,為客戶端用戶登錄服務(wù)器做準(zhǔn)備。登錄區(qū):輸入客戶端用戶的用戶名,登錄服務(wù)器后才能玩24分游戲與查看積分前十的玩家排行。出題區(qū):用戶點擊產(chǎn)生四個數(shù)按鈕后,客戶端向服務(wù)器發(fā)出獲取數(shù)字的請求,并開始計時。計時區(qū):在用戶點擊產(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:連接按鈕的點擊事件。獲取指定服務(wù)器的IP地址和端口,連接服務(wù)器,創(chuàng)建并啟動線程接收服務(wù)器的信息。loginbtn_Click:登錄按鈕的點擊事件。向服務(wù)器發(fā)送登錄請求。getnumbtn_Click:獲取四個隨機(jī)數(shù)按鈕的點擊事件。向服務(wù)器請求四個隨機(jī)數(shù),并開始計時。submitbtn_Click:提交表達(dá)式按鈕的點擊事件。停止計時,并向服務(wù)器提交表達(dá)式。exitbtn_Click:斷開連接按鈕的點擊事件。斷開與服務(wù)器的連接。topbtn_Click:查看排名前十按鈕的點擊事件。向服務(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ù)按鈕的點擊事件。獲取指定的服務(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ù)按鈕的點擊事件。服務(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é)點對象 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é)點上 IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(address), port); /監(jiān)聽綁定的網(wǎng)絡(luò)節(jié)點 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é)點號 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一親子采摘活動方案
- 六一慈善活動策劃方案
- 六一漢唐活動方案
- 六一活動健美操活動方案
- 六一活動合唱活動方案
- 六一班活動優(yōu)惠活動方案
- 六一納新活動方案
- 六一節(jié)教學(xué)活動方案
- 六一蛋糕店活動策劃方案
- 六十校慶活動策劃方案
- 唐山市樂亭縣樂亭鎮(zhèn)社區(qū)工作者考試真題2022
- 現(xiàn)金盤點表完整版
- 軍標(biāo)類型整理文檔
- 國開電大 管理概論 形考任務(wù)一(畫組織結(jié)構(gòu)圖)
- 2023年高三新高考英語復(fù)習(xí)備考策略及方法指導(dǎo)(深度課件)
- 高層建筑施工基坑工程勘察及支護(hù)結(jié)構(gòu)選型培訓(xùn)
- 304不銹鋼管材質(zhì)證明書
- 預(yù)拌混凝土及原材料檢測理論考試題庫(含答案)
- 《植物生理學(xué)》課件第三章+植物的光合作用
- 游泳館網(wǎng)架翻新施工組織方案設(shè)計
- 有機(jī)化學(xué)所有的命名--超全.
評論
0/150
提交評論