局域網點對點通信軟件設計與實現_第1頁
局域網點對點通信軟件設計與實現_第2頁
局域網點對點通信軟件設計與實現_第3頁
局域網點對點通信軟件設計與實現_第4頁
局域網點對點通信軟件設計與實現_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、網絡編程技術課程設計報告課程設計題目:局域網點對點通信軟件與實現整理所在系部: 計算機科學與工程系 整理所在專業: 網絡工程 整理所在班級: 作 者 姓 名 : 作 者 學 號 : 指導教師姓名: 完 成 時 間 : 2013年07月10日 1 / 23課程設計任務書課題名稱局域網點對點通信軟件設計與實現完成時間 20周指導教師職稱講師學生姓名班 級總體設計要求和技術要點1. 總體功能描述:(1)本軟件采用單純P2P方式,各個客戶端之間可以直接發送消息和傳輸文件;(2)根據選中的用戶,實現一對一或一對多通信。(3)軟件中包括在線的用戶信息列表、通信信息列表(聊天及文件傳輸)等。(4)實現用戶的

2、動態加入和退出。(5)在線列表中記錄登陸的主機名稱及IP位置信息。(6)客戶端定期發送心跳包,表示本客戶端的存在。2. 開發工具: 采用Visual Studio 2010,編程語言為C#。3. 采用技術: 多線程技術、Socket通信技術、TCP、UDP通信技術,P2P技術等。4. 基本要求:Ø 操作簡便Ø 功能齊全,風格統一Ø 沒有明顯錯誤和異常工作內容及時間進度安排119周:需求分析及項目的設計與實現220周:項目驗收與答辯,撰寫課程設計報告課程設計成果1局域網點對點通信軟件2課程設計報告書摘要所謂網絡中的點對點通信是實現網絡上不同計算機之間,不經過任何中繼

3、設備而直接交換數據或服務的一種技術。由于允許網絡中任何一臺計算機可以直接連到網絡中的其他計算機,并與之進行數據交換,這樣既可以消除中間環節,也使得網絡上的溝通變的更加容易、更加直接。本文介紹的是一種是用Winsock編程技術,基于TCP/IP協議的、面向連接的流式套接字網絡通信編程設計。局域網即時通訊軟件使用TCP協議作為傳輸層的協議,采用點對點模式服務,不需要服務器支持,使局域網用戶的使用更加方便和高效。它可以實現局域網用戶的自動檢測,用戶間文本信息的交流,文件的傳輸等功能。本系統使用Visual Studio 2010作為開發工具,將.NET中的一些技術運用到系統中關鍵詞:點對點;TCP/

4、IP;Socket;UDP;P2P目 錄摘要2目 錄3第1章 緒論41.1課題研究現狀分析41.2選題的目的及意義4第2章 系統需求分析52.1 問題的提出52.2 系統的設計目標5第3章 系統總體設計63.1系統功能設計63.2功能模塊的說明73.2.1初始化(廣播用戶信息)73.2.2用戶列表管理73.2.3文本信息傳輸73.2.4文件傳輸73.2.5發送心跳包7第4章 系統實現84.1初始化模塊的設計和實現84.1.1監聽端口84.2 廣播消息84.3 文本消息的發送和接收94.4 文件的發送和接收124.5發送心跳包14第5章 課程設計總結165.1 主要問題及解決辦法165.2 課程

5、設計體會165.3 自我評定16參考文獻17第1章 緒論1.1課題研究現狀分析隨著計算機網絡日新月異的發展,人們的交流方式越來越多,傳統的交流方式已經難以滿足人們的交流要求,在互聯網或局域網上即時的和好友取得了解,已經成為當今社會人們主流的了解方式。因此,兩臺計算機之間進行即時通訊、發送文件等交流方式已經成為必然潮流。作為整個計算機網絡的基礎,局域網用戶之間進行即時通許的需求更大,而且他們之間進行文件傳輸與共享的頻率更高,因此有必要設計一款專門為局域網用戶使用的即時通訊軟件。當前存在的即時通訊軟件很多,但其中很多一部分由于嵌入了太多的娛樂功能而不很實用。對于局域網用戶來說,首先,由于他們之間進

6、行通訊的不確定性和隨機性,所以如果專門為他們建立一個服務器端的話,勢必會造成很大的浪費,因此,本軟件選擇實用點對點服務模式,不需要服務器支持。其次,局域網用戶之間進行交流的主要方式及時文字信息交流,因此,本軟件實現的最基本的功能就是文字信息的傳輸。再次,局域網用戶要頻繁的進行文件的傳輸,所以本軟件還實現了兩個用戶之間文件的傳輸。1.2選題的目的及意義隨著計算機和Internet的飛速發張,網上聊天已成為人們相互交流的一中方式,與E-mail,電話相比,聊天服務更具有實時性和有效性。網絡版的聊天軟件種類繁多,如QQ,MSN等,實時隨時隨地上網聊天,給人們帶來了很大的方便。但是這些聊天軟件業存在以

7、下不足:用戶必須連接Internet;用戶工作時容易沉迷于網絡聊天。為了方便單位企業內部的信息交流,避免企業內部員工使用類似QQ等軟件泄露內部消息,減少不必要的財力和人力資源浪費,開發一耳光局域網聊天軟件是非常必要的。 第2章 系統需求分析2.1 問題的提出為了滿足人們在局域網內部進行安全、有效、快速的溝通以及文件的傳輸的目的。2.2 系統的設計目標(1)本軟件采用單純P2P方式,各個客戶端之間可以直接發送消息和傳輸文件;(2)根據選中的用戶,實現一對一或一對多通信。(3)軟件中包括在線的用戶信息列表、通信信息列表(聊天及文件傳輸)等。(4)實現用戶的動態加入和退出。(5)在線列表中記錄登陸的

8、主機名稱及IP位置信息。(6)客戶端定期發送心跳包,表示本客戶端的存在。第3章 系統總體設計3.1系統功能設計 本軟件可以實現局域網內用戶的自動檢測,用戶之間的文件信息交流,文件傳輸等功能。據此,本設計的功能模塊可以分為5個:廣播用戶信息,用戶列表管理,文字信息傳輸,文件傳輸,發送心跳包。系統的總功能模塊圖如圖3-1所示:圖3-1 系統功能模塊圖用戶主界面如圖3-2所示:圖3-2用戶界面圖3.2功能模塊的說明3.2.1初始化(廣播用戶信息)該模塊的主要功能是搜集本機用戶的相關信息,如計算機名,IP位置,初始化Socket,開始監聽端口,并把本機用戶的信息通過廣播消息發送出去。3.2.2用戶列表

9、管理該模塊的主要功能是對收到的用戶信息進行管理,包括用戶列表的更新,用戶信息查找,同時還要對其他用戶的廣播消息進行反饋。3.2.3文本信息傳輸該模塊的主要功能是把當前文本框的內容發送給當前選中的用戶,分為私聊和群聊,如果發送成功,則把當前文本框的內容加上某些必須的信息在聊天記錄文本框中顯示,同時清空輸入文本框。該模塊還要具有糾正用戶為空(為選中用戶)或者發送內容為空的情況。3.2.4文件傳輸該模塊的主要功能是實現兩個用戶之間的點對點的文件傳輸。使用TCP協議進行傳輸,能確保文件發送過程中不出現丟失現象。3.2.5發送心跳包該模塊的主要功能是檢測用戶是否在線。第4章 系統實現4.1初始化模塊的設

10、計和實現使用Socket編程都是使用的是一些綁定端口和IP的普通的程序,而UDP數據報則支持向局域網內的所有用戶發送組播消息,即向ip發送消息,局域網內所有監聽相同端口的UDPClient都會收到該消息。4.1.1監聽端口 本程序中用到了大量的Socket Udp發送和接收數據的操作,所以把這些相關操作定義為一個組件,這樣就簡化了程序中其他部分的代碼;private UdpClient udpClient;private int port = 8002;private void Form1_Load_1(object sender, EventArgs e) Thread

11、 myThread = new Thread(ReceiveMessage); myThread.Start(); private void ReceiveMessage() udpClient = new UdpClient(port); 4.2 廣播消息發送廣播消息主要代碼:private void Form1_Load(object sender, EventArgs e) name = Dns.GetHostName(); Cursor.Current = Cursors.WaitCursor; Thread myThread = new Thread(ReceiveMessage);

12、 myThread.Start(); Thread.Sleep(1000); SendMessage(broderCastIP, "login," + name); IPAddress ips = Dns.GetHostAddresses(name); IPAddress ip = ips1; txtIP.Text = ip.ToString(); txtHostName.Text = name; txtIP.ReadOnly = true; txtHostName.ReadOnly = true; Thread t = new Thread(lis); t.Start()

13、; t.IsBackground = true; 4.3 文本消息的發送和接收文本消息的發送與接收是本系統用戶使用的最基本的功能模塊。文本消息的發送涉及到的內容有獲取當前選中用戶的ip位置以及其他信息,獲取當前文本框中的內容并對其中的內容作簡單的判斷(是否為空,禁止發送空消息),將當前文本框中的內容復制到聊天記錄文本框并清空當前文本框的內容等。發送的核心代碼:private void button1_Click(object sender, EventArgs e) if (rtbSend.Text.Trim().Length > 0) if (rdoPrivate.Checked) i

14、f (lvwUser.SelectedItems.Count = 0) MessageBox.Show("請選擇一個用戶"); else string ip = lvwUser.SelectedItems0.SubItems2.Text.ToString(); string sendName = lvwUser.SelectedItems0.SubItems1.Text.ToString(); SendMessage(IPAddress.Parse(ip), "message," + name + "," + rtbSend.Text

15、); rtbReceive.Text += "" + sendName + "發送(私聊):" + rtbSend.Text + "rn" rtbSend.Text = "" else SendMessage(broderCastIP, "messageToall," + name + "," + rtbSend.Text); rtbSend.Text = "" else MessageBox.Show("發送內容不能為空!"); pr

16、ivate void SendMessage(IPAddress ip, string str) UdpClient myClient = new UdpClient(); IPEndPoint iep = new IPEndPoint(ip, port); byte bytes = System.Text.Encoding.UTF8.GetBytes(str); try myClient.Send(bytes, bytes.Length, iep); catch (Exception ex) MessageBox.Show(ex.Message, " 失敗"); fina

17、lly myClient.Close(); 接收的核心代碼:private void ReceiveMessage() udpClient = new UdpClient(port); udpClient.JoinMulticastGroup(broderCastIP); IPEndPoint remote = null; while (true) try byte bytes = udpClient.Receive(ref remote); String str = Encoding.UTF8.GetString(bytes, 0, bytes.Length); String splitSt

18、ring = str.Split(','); int s = splitString0.Length; string remoteName = splitString1; switch (splitString0) case "login": setLvwUser(remoteName, remote.Address); if (remoteName != name) SendMessage(remote.Address, "login2," + name); SetStatue(remoteName, "on");

19、break; case "login2": setLvwUser(remoteName, remote.Address); SetStatue(remoteName, "on"); break; case "message": setChatMessage(splitString2.ToString(), remoteName); break; case "logout": RemoveLvwUser(remoteName); SetStatue(remoteName, "out"); brea

20、k; case "request": DialogResult r = MessageBox.Show(remoteName + "向您發送文件" + splitString2 + "確認接收嗎?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); RemoteFileName = splitString2; if (r = DialogResult.OK) SendMessage(remote.Address, "yes,")

21、; else SendMessage(remote.Address, "no,"); break; case "yes": SendFile(remote.Address); break; case "no": MessageBox.Show("對方拒絕接收文件!"); break; case "messageToall": setPublicMessage(splitString2.ToString(), remoteName); break; case"on": chan

22、geLvwUser(str); break ; catch (Exception ex) MessageBox.Show(ex.Message); break; 4.4 文件的發送和接收文件的發送和接收涉及到的內容比較多,由于使用TCP協議進行數據的發送與接收,能確保文件發送過程中不出現丟失的現象,所以不涉及超時問題。同時,由于文件的大小不一,所以文件的發送與接收是分塊進行的,這同時也涉及到文件的讀取和寫入,文件塊的大小等內容。文件傳輸過程中用到的核心類SendFile的定義如下:private void SendFile(IPAddress ip) ofd.InitialDirectory

23、= "D:" string path = txtSelectFile; filename = System.IO.Path.GetFileName(path); string fileep = Path.GetExtension(path); TcpClient client = new TcpClient(); client.Connect(ip, 9998); FileStream file = new FileStream(path, FileMode.Open,FileAccess.Read); BinaryReader binaryreader = new Bin

24、aryReader(file); byte b = new byte4096; int date; while (date = binaryreader.Read(b, 0, 4096) != 0) client.Client.Send(b, date, SocketFlags.None); client.Client.Shutdown(SocketShutdown.Both); binaryreader.Close(); file.Close(); MessageBox.Show("文件發送成功!"); 文件發送的核心代碼如下:private void btnSendFi

25、le_Click(object sender, EventArgs e) if (lvwUser.SelectedItems.Count = 0) MessageBox.Show("請選擇一個用戶通信!"); else string ip = lvwUser.SelectedItems0.SubItems2.Text.ToString(); txtSelectFile = null; ofd = new OpenFileDialog(); if (ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK) txtSele

26、ctFile = ofd.FileName; filename = Path.GetFileName(txtSelectFile); SendMessage (IPAddress .Parse(ip),"request,"+name+","+filename ); txtFileName.Text = txtSelectFile.Split('')txtSelectFile.Split('').Length -1; txtFileWay.Text = txtSelectFile; 文件接收的核心代碼如下:public vo

27、id lis() while (true) string path = null; t1 = new TcpListener(9998); t1.Start(); ReSocket = t1.AcceptSocket(); sfd = new SaveFileDialog(); sfd.Filter = "文本文件|*.txt|C#文件|*.cs|word文件|*.doc|所有文件|*.*" sfd.FilterIndex = 4; sfd.RestoreDirectory = true; sfd.AddExtension = true; sfd.FileName = Re

28、moteFileName; invokeThread = new Thread(new ThreadStart(InvokeMethod); invokeThread .SetApartmentState(ApartmentState.STA); invokeThread.Start(); invokeThread.Join(); if (result = System.Windows.Forms.DialogResult.OK) path = sfd.FileName; FileStream fs = new FileStream(path, FileMode.Create, FileAcc

29、ess.Write, FileShare.ReadWrite); BinaryWriter binarywrite = new BinaryWriter(fs); int count; byte b = new byte4096; while (count=ReSocket.Receive (b,4096,SocketFlags.None)!=0) binarywrite .Write (b,0,count); binarywrite .Close (); fs.Close (); ReSocket .Close (); Thread .Sleep (1000); t1.Stop(); Mes

30、sageBox.Show ("文件接收成功!"); 4.5發送心跳包當用戶上線后,會循環執行該模塊,以5秒的間隔向所有用戶發送心跳包來說明自己在線,其他用戶收到心跳包后每隔5秒更新一次,更新時遍歷自己的用戶列表,與心跳包里的用戶信息比較,找到該用戶后將其生命值設置為3,若更新時沒有發現來自某用戶的心跳包,則將該用戶生命值減1,當生命值為0時則判定該用戶以外掉線,將該用戶從用戶列表中移除,此過程對用戶是透明的,由程序自行完成。發送心跳包的核心代碼如下:private delegate void schangeLvwUserDelegate(string m); private

31、 void changeLvwUser(string m) if (lvwUser.InvokeRequired) schangeLvwUserDelegate d = changeLvwUser; lvwUser.Invoke(d, m); else int i = 0; for (; i < lvwUser.Items.Count; i+) if (lvwUser.Itemsi.SubItems2.Text.Trim() = m.Split(',')1) lvwUser.Itemsi.Tag = "1" break; if (i = lvwUser.Items.Count) setLvwUser(m.Split(',')2, IPAddress.Parse(m.Split(',')1); SetStatue(m.Split(',')2, "on"); private void timer1_Tick(object sender, EventArgs e) IPAddress ips = Dns.GetHostAddresses(name); IPAddress ip = ips1; SendMessa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論