《C#網(wǎng)絡(luò)應(yīng)用編程》課程設(shè)計(jì)(共53頁)_第1頁
《C#網(wǎng)絡(luò)應(yīng)用編程》課程設(shè)計(jì)(共53頁)_第2頁
《C#網(wǎng)絡(luò)應(yīng)用編程》課程設(shè)計(jì)(共53頁)_第3頁
《C#網(wǎng)絡(luò)應(yīng)用編程》課程設(shè)計(jì)(共53頁)_第4頁
《C#網(wǎng)絡(luò)應(yīng)用編程》課程設(shè)計(jì)(共53頁)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上C#網(wǎng)絡(luò)應(yīng)用編程院(系): 專業(yè)班級(jí): 姓名: 學(xué)號(hào): 組員: 日期: 成績(jī): 專心-專注-專業(yè)一、課程設(shè)計(jì)目標(biāo)1. 通過C#網(wǎng)絡(luò)編程的課程設(shè)計(jì),能夠增強(qiáng)我們對(duì)C#網(wǎng)絡(luò)編程的認(rèn)識(shí),更加牢固的掌握網(wǎng)絡(luò)編程的相關(guān)知識(shí)。2. 綜合運(yùn)用學(xué)習(xí)到的理論知識(shí),提高實(shí)踐能力。3. 通過小組討論形式對(duì)任務(wù)進(jìn)行分解,提出實(shí)現(xiàn)方案,制定計(jì)劃,小組成員分工協(xié)作,共同完成課程設(shè)計(jì)題目,培養(yǎng)團(tuán)隊(duì)合作能力。4. 課程設(shè)計(jì)期間,通過對(duì)問題的分析查找資料,培養(yǎng)資料查詢以及運(yùn)用現(xiàn)代信息技術(shù)獲取相關(guān)信息并進(jìn)行歸納總結(jié)的基本能力。5. 與同學(xué)討論,互相學(xué)習(xí),提升個(gè)人學(xué)習(xí)能力。二、課程設(shè)計(jì)內(nèi)容1課程設(shè)計(jì)的內(nèi)容

2、1.1參考C#網(wǎng)絡(luò)應(yīng)用編程實(shí)驗(yàn)指導(dǎo)與開發(fā)實(shí)例,編寫一個(gè)網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋游戲,簡(jiǎn)單的實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋游戲的基本功能。1.2 由于和小組成員分工合作,本人負(fù)責(zé)客戶端方面代碼。因此,本課程設(shè)計(jì)報(bào)告主要涉及服務(wù)器端的內(nèi)容。并且把重點(diǎn)放在了線程管理,服務(wù)器如何管理多個(gè)玩家,服務(wù)器和客戶端如何進(jìn)行通信等等。2原理介紹(服務(wù)器與客戶端通信描述) 網(wǎng)絡(luò)編程的關(guān)鍵是服務(wù)器和客戶端如何通信,當(dāng)服務(wù)器和客戶端建立連接后,服務(wù)器或客戶端當(dāng)接收到對(duì)方發(fā)送過來的信息后,要對(duì)接收的信息做出反應(yīng)。為了讓通信雙方都能理解對(duì)方發(fā)送過來的信息含義,必須事先規(guī)定每條信息的格式以及信息的含義,在本例中,規(guī)定任何一條信息,都必須以命令開

3、頭,命令后面跟上需要的參數(shù)。命令和參數(shù)以及各參數(shù)之間均用逗號(hào)分隔。這樣接收方接收到信息后,才能理解,并且根據(jù)參數(shù)可作出相應(yīng)的反應(yīng)。3開發(fā)環(huán)境及技術(shù)介紹3.1 開發(fā)環(huán)境:Microsoft Visual Studio 2008 Microsoft Visual Studio 2008是面向Windows Vista、Office 2007、Web 2.0的下一代開發(fā)工具,代號(hào)“Orcas”,是對(duì)Visual Studio 2005一次及時(shí)、全面的升級(jí)。VS2008引入了250多個(gè)新特性,整合了對(duì)象、關(guān)系型數(shù)據(jù)、XML的訪問方式,語言更加簡(jiǎn)潔。使用Visual Studio 2008可以高效開發(fā)W

4、indows應(yīng)用。設(shè)計(jì)器中可以實(shí)時(shí)反映變更,XAML中智能感知功能可以提高開發(fā)效率。同時(shí)Visual Studio 2008支持項(xiàng)目模板、調(diào)試器和部署程序。Visual Studio 2008可以高效開發(fā)Web應(yīng)用,集成了AJAX 1.0,包含AJAX項(xiàng)目模板,它還可以高效開發(fā)Office應(yīng)用和Mobile應(yīng)用。3.2 引用命名空間以及相關(guān)類 命名空間: 除了一些基本的,本例中還引用了一些其他的命名空間,如下:System.IO 命名空間包含允許讀寫文件和數(shù)據(jù)流的類型以及提供基本文件和目錄支持的類型。System.Net.Sockets 命名空間為需要嚴(yán)密控制網(wǎng)絡(luò)訪問的開發(fā)人員提供了 Wind

5、ows Sockets (Winsock) 接口的托管實(shí)現(xiàn)。 、 和  類封裝有關(guān)創(chuàng)建到 Internet 的 TCP 和 UDP 連接的詳細(xì)信息。System.Threading 用于多線程編程,對(duì)線程進(jìn)行管理,如創(chuàng)建線程、啟動(dòng)線程、終止線程、合并線程等等。System.Net 該命名空間為Internet網(wǎng)絡(luò)上使用的多種協(xié)議提供了方便的編程接口,利用這個(gè)命名空間提供的類,不需要考慮所使用協(xié)議的具體細(xì)節(jié),就能很快實(shí)現(xiàn)具體功能。 System.Windows.Forms 命名空間包含用于創(chuàng)建基于 Windows 的應(yīng)用程序的類,以充分利用 Mi

6、crosoft Windows 操作系統(tǒng)中提供的豐富的用戶界面功能相關(guān)類: 類,用特定的編碼將基元數(shù)據(jù)類型讀作二進(jìn)制值。類,以二進(jìn)制形式將基元類型寫入流,并支持用特定的編碼寫入字符串。類,偵聽來自 TCP 網(wǎng)絡(luò)客戶端的連接。Thread類,創(chuàng)建并控制線程,設(shè)置其優(yōu)先級(jí)并獲取其狀態(tài)。IPaddress 類,提供網(wǎng)際協(xié)議 (IP) 地址。IPEndPoint類,將網(wǎng)絡(luò)端點(diǎn)表示為 IP 地址和端口號(hào)。界面設(shè)計(jì): 使用的控件:(1)兩個(gè)button負(fù)責(zé)啟動(dòng)和終止服務(wù)。(2)listBox顯示客戶狀態(tài)信息以及服務(wù)器與客戶端通信的內(nèi)容。(3)兩個(gè)textBox控件,分別控制游戲室允許進(jìn)入的最多人數(shù)和游戲室

7、同時(shí)開出的房間數(shù)。整體界面如圖所示4服務(wù)器端主要代碼介紹 運(yùn)行VS,新建一個(gè)名為GobangServer的Windows應(yīng)用程序項(xiàng)目。4.1 添加一個(gè)User.cs類,表示所有連接到服務(wù)器的客戶。代碼如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;using System.IO;namespace GobangServer class User public readonly TcpClient client; public

8、 readonly StreamReader sr; public readonly StreamWriter sw; public string userName; public User(TcpClient client) this.client = client; this.userName = "" NetworkStream netStream = client.GetStream(); sr = new StreamReader(netStream, System.Text.Encoding.Default); sw = new StreamWriter(net

9、Stream, System.Text.Encoding.Default); 4.2 添加一個(gè)名為Player.cs的類,表示坐在游戲桌兩邊的玩家,代碼如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GobangServer class Player private User user; public User GameUser get return user; set user = value; private bool start; public b

10、ool Start get return start; set start = value; public Player() start = false; user = null; 4.3 添加一個(gè)名為GobangBoard.cs的類,表示棋盤,代碼如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GobangServer class GobangBoard public const int None = -1; /無棋子 public const int

11、 Black = 0; /黑色棋子 public const int White = 1; /白色棋子 private int, grid = new int15, 15; /15*15的方格 / <summary> / 棋盤 / </summary> public int, Grid get return grid; private int nextIndex; public int NextIndex / 應(yīng)該黑方放棋子還是白方放棋子 get return nextIndex; set nextIndex = value; public GobangBoard()/

12、構(gòu)造函數(shù) InitializeBoard(); public void InitializeBoard() / 將15*15的方格中的每個(gè)交叉點(diǎn)均設(shè)置為無棋子 for (int i = 0; i <= grid.GetUpperBound(0); i+) for (int j = 0; j <= grid.GetUpperBound(1); j+) gridi, j = None; nextIndex = Black; public bool IsExist(int i, int j) / 判斷放棋子的位置是否已有棋子 if (gridi, j != None) return tr

13、ue; else return false; public bool IsWin(int i, int j) / 判斷棋子落下后是否獲勝 /與方格的第ij交叉點(diǎn)向四個(gè)方向的連子數(shù),依次是水平,垂直,左上右下,左下右上 int numbers = new int4; numbers0 = GetRowNumber(i, j); numbers1 = GetColumnNumber(i, j); numbers2 = GetBacklashNumber(i, j); numbers3 = GetSlashNumber(i, j); for (int k = 0; k < numbers.Le

14、ngth; k+) /檢查是否獲勝 if (Math.Abs(numbersk) = 5) return true; return false; / 判斷橫向相同顏色的棋子個(gè)數(shù) private int GetRowNumber(int i, int j) int num = 1; /連子個(gè)數(shù) int x = i + 1; /向右檢查 while (x < 15) if (gridx, j = gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; x+; else break; x = i - 1; /向左檢查 while (x >= 0) if (gridx, j =

15、gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; x-; else break; return num; private int GetColumnNumber(int i, int j) / 判斷縱向相同顏色的棋子個(gè)數(shù) int num = 1; /連子個(gè)數(shù) int y = j + 1; /向下檢查 while (y < 15) if (gridi, y = gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; y+; else break; /向上檢查 y = j - 1; while (y >= 0) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) if (gri

16、di, y = gridi, j) num+; y-; else break; return num; / 判斷左上到右下相同顏色的棋子個(gè)數(shù) private int GetBacklashNumber(int i, int j) int num = 1; /連子個(gè)數(shù) int x = i + 1; /右下方向 int y = j + 1; while (x < 15 && y < 15) if (gridx, y = gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; x+; y+; else break; /左上方向(x-,y-) x = i - 1;

17、 y = j - 1; /不超出棋格 while (x >= 0 && y >= 0) if (gridx, y = gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; x-; y-; else break; return num; private int GetSlashNumber(int i, int j) / 判斷左下到右上相同顏色的棋子個(gè)數(shù) int num = 1; /連子個(gè)數(shù) int x = i - 1; int y = j + 1; while (x >= 0 && y < 15) if (gridx, y =

18、 gridi, j) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) num+; x-; y+; else break; x = i + 1; y = j - 1; while (x < 15 && y >= 0) /前方棋子與ij點(diǎn)不同時(shí)跳出循環(huán) if (gridx, y = gridi, j) num+; x+; y-; else break; return num; 4.4 添加一個(gè)名為Service.cs的類,代碼如下:using System;using System.Collections.Generic;using System.Linq;using System.

19、Text;using System.Windows.Forms;using System.Net.Sockets;using System.IO;namespace GobangServer / 顯示或發(fā)送信息 class Service private ListBox listbox; private delegate void AddListBoxItemCallback(string str); private AddListBoxItemCallback addListBoxItemCallback; public Service(ListBox listbox) this.listb

20、ox = listbox; addListBoxItemCallback = new AddListBoxItemCallback(AddListBoxItem); public void AddListBoxItem(string str) /比較調(diào)用AddListBoxItem方法的線程和創(chuàng)建listBox的線程是否為同一個(gè)線程 if (listbox.InvokeRequired = true) listbox.Invoke(addListBoxItemCallback, str); else if (listbox.IsDisposed = false) listbox.Items.A

21、dd(str); listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); / 將信息發(fā)送給指定的客戶 public void SendToOne(User user, string str) try user.sw.WriteLine(str); user.sw.Flush(); AddListBoxItem(string.Format("向0發(fā)送1", user.userName, str); catch AddListBoxItem(string.Format("向0發(fā)

22、送信息失敗", user.userName); / 將信息發(fā)送給指定房間的所有人 public void SendToRoom(GameRoom gameRoom, string str) /向玩家發(fā)送 for (int i = 0; i < gameRoom.gamePlayer.Length; i+) if (gameRoom.gamePlayeri.GameUser != null) SendToOne(gameRoom.gamePlayeri.GameUser, str); /向旁觀者發(fā)送 for (int i = 0; i < gameRoom.lookOnUs

23、er.Count; i+) SendToOne(gameRoom.lookOnUseri, str); public void SendToAll(System.Collections.Generic.List<User> userList, string str) for (int i = 0; i < userList.Count; i+) SendToOne(userListi, str); 4.5 添加一個(gè)名為GameRoom.cs的類,游戲室內(nèi)的每個(gè)小房間,代碼如下:using System;using System.Collections.Generic;usin

24、g System.Linq;using System.Text;using System.IO;using System.Net.Sockets;using System.Windows.Forms;namespace GobangServer class GameRoom / 進(jìn)入房間的旁觀者 public List<User> lookOnUser = new List<User>(); / 坐在玩家位置上的黑白兩個(gè)游戲者 public Player gamePlayer = new Player2; / 黑方玩家 public Player BlackPlayer

25、 get return gamePlayer0; set gamePlayer0 = value; / 白方玩家 public Player WhitePlayer get return gamePlayer1; set gamePlayer1 = value; private GobangBoard gameBoard = new GobangBoard(); public GobangBoard GameBoard get return gameBoard; / 向listbox中添加顯示信息以及向客戶發(fā)送信息 private ListBox listbox; private Servic

26、e service; /構(gòu)造函數(shù) public GameRoom(ListBox listbox) this.listbox = listbox; gamePlayer0 = new Player(); gamePlayer1 = new Player(); service = new Service(listbox); /將棋盤上的棋子全部清除 gameBoard.InitializeBoard(); / 放置棋子 public void SetChess(int i, int j, int chessColor) /發(fā)送格式:SetChess,行,列,顏色 gameBoard.Gridi,

27、 j = chessColor; gameBoard.NextIndex = gameBoard.NextIndex = 0 ? 1 : 0; service.SendToRoom(this, string.Format("SetChess,0,1,2", i, j, chessColor); if (gameBoard.IsWin(i, j) ShowWin(chessColor); else service.SendToRoom(this, "NextChess," + gameBoard.NextIndex); private void ShowW

28、in(int chessColor) gamePlayer0.Start = false; gamePlayer1.Start = false; gameBoard.InitializeBoard(); service.SendToRoom(this, string.Format("Win,0", chessColor); 4.6 重命名Form1.cs為FormServer.cs,修改代碼如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Dat

29、a;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.IO;using System.Threading;using System.Net;namespace GobangServer public partial class FormServer : Form private int maxUsers; List<User> userList = new List<User>(

30、); private int maxRoomNumbers; private GameRoom gameRoom; IPAddress localAddress; private int port = 51888; private TcpListener myListener; private Service service; public FormServer() InitializeComponent(); listBoxStatus.HorizontalScrollbar = true; service = new Service(listBoxStatus); /加載窗體觸發(fā)的事件 p

31、rivate void FormServer_Load(object sender, EventArgs e) listBoxStatus.HorizontalScrollbar = true; IPAddress addrIp = Dns.GetHostAddresses(Dns.GetHostName(); foreach (IPAddress p in addrIp) if (p.AddressFamily = AddressFamily.InterNetwork) localAddress = p; break; buttonStop.Enabled = false; private

32、void buttonStart_Click(object sender, EventArgs e) /開始按鈕事件 if (int.TryParse(textBoxMaxTables.Text, out maxRoomNumbers) = false | int.TryParse(textBoxMaxUsers.Text, out maxUsers) = false) MessageBox.Show("請(qǐng)輸入在規(guī)定范圍內(nèi)的正整數(shù)"); return; if (maxUsers < 1 | maxUsers > 300) MessageBox.Show(&quo

33、t;允許進(jìn)入的人數(shù)只能在1300之間"); return; if (maxRoomNumbers < 1 | maxRoomNumbers > 100) MessageBox.Show("允許開出的房間數(shù)只能在1100之間"); return; textBoxMaxUsers.Enabled = false; textBoxMaxTables.Enabled = false; /初始化數(shù)組 gameRoom = new GameRoommaxRoomNumbers; for (int i = 0; i < maxRoomNumbers; i+)

34、gameRoomi = new GameRoom(listBoxStatus); myListener = new TcpListener(localAddress, port); myListener.Start(); service.AddListBoxItem(string.Format("0:yyyy年M月d日(dddd)h點(diǎn)m分開始在1:2監(jiān)聽客戶連接", DateTime .Now, localAddress, port); ThreadStart ts = new ThreadStart(ListenClientConnect); Thread myThrea

35、d = new Thread(ts); myThread.Start(); buttonStart.Enabled = false; buttonStop.Enabled = true; /停止服務(wù)事件 private void buttonStop_Click(object sender, EventArgs e) service.AddListBoxItem(string.Format("目前連接用戶數(shù):0", userList.Count); service.AddListBoxItem(string.Format("0:yyyy年M月d日(dddd)h點(diǎn)m

36、分停止服務(wù),并依次使客戶退出。", DateTime.Now); StopCLientAndListener(); buttonStart.Enabled = true; buttonStop.Enabled = false; textBoxMaxUsers.Enabled = true; textBoxMaxTables.Enabled = true; /關(guān)閉TcpClient實(shí)例并停止 監(jiān)聽 private void StopCLientAndListener() for (int i = 0; i < userList.Count; i+) userListi.clien

37、t.Close(); myListener.Stop(); / 循環(huán)監(jiān)聽客戶端連接,直到單機(jī)【停止服務(wù)】按鈕或退出程序 private void ListenClientConnect() while (true) TcpClient newClient = null; try newClient = myListener.AcceptTcpClient(); catch break; ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData); Thread threadReceive = new Thread(pts

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論