網(wǎng)絡(luò)課程設(shè)計報告----基于tcp的點(diǎn)對點(diǎn)即時通信工具_(dá)第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機(jī)網(wǎng)絡(luò)課程設(shè)計</b></p><p>  ---基于TCP的點(diǎn)對點(diǎn)即時通信工具</p><p><b>  設(shè)計題目及設(shè)計目標(biāo)</b></p><p><b>  設(shè)計題目</b></p><p>  題目:實(shí)現(xiàn)一個基于網(wǎng)絡(luò)的應(yīng)用</p

2、><p>  要求:利用TCP或UDP完成聯(lián)網(wǎng)通信,并在此基礎(chǔ)上完成數(shù)據(jù)應(yīng)用。</p><p><b>  設(shè)計目標(biāo)</b></p><p>  這個軟件實(shí)現(xiàn)的功能主要包括局域網(wǎng)內(nèi)的點(diǎn)對點(diǎn)聊天(基本功能),局域網(wǎng)內(nèi)搜索IP并顯示,搜索任意IP段并顯示。應(yīng)用的主要范圍面向局域網(wǎng)。</p><p><b>  設(shè)計的思

3、路</b></p><p><b>  1.選用語言:C#</b></p><p>  2.使用的主要技術(shù):TcpClient,thread(線程)</p><p><b>  3.功能結(jié)構(gòu)圖。</b></p><p><b>  設(shè)計的實(shí)現(xiàn)</b></p&g

4、t;<p><b>  程序流程圖:</b></p><p><b>  連接不成功</b></p><p><b>  不為空</b></p><p><b>  為空</b></p><p><b>  連接成功</b&g

5、t;</p><p><b>  繼續(xù)聊天</b></p><p><b>  程序結(jié)束</b></p><p><b>  獲取本機(jī)IP模塊</b></p><p>  使用的C#的IPHOSTENTRY和IPADDRESS兩個類</p><p>  

6、string hostname1 = Dns.GetHostName();</p><p>  IPHostEntry myentry = Dns.GetHostByName(hostname1);</p><p>  IPAddress myaddress = new IPAddress(myentry.AddressList[0].Address);</p><p&

7、gt;  string myip = myaddress.ToString();</p><p>  this.localip.Text = myip;</p><p>  用已經(jīng)獲取的本機(jī)的名字來獲取本機(jī)的IP。</p><p><b>  獲取局域網(wǎng)IP</b></p><p>  int ipdot = myip.

8、LastIndexOf('.');</p><p>  myip = myip.Substring(0,ipdot+1);</p><p>  string aa = "0";//獲取本機(jī)的IP后,獲取最后一個.的位置,并且將這個.后面的數(shù)據(jù)替換成0和255,實(shí)現(xiàn)從局域網(wǎng)0-255的搜索</p><p>  string bb =

9、 "255";</p><p>  string startip = myip + aa;</p><p>  string endip = myip + bb;</p><p>  this.ipstart.Text = startip;</p><p>  this.ipend.Text = endip;</p&

10、gt;<p>  搜索指定IP段的IP地址</p><p>  對輸入的IP段進(jìn)行搜索,</p><p>  string ipcur = this.ipstart.Text;</p><p>  int ipdot = ipcur.LastIndexOf('.');</p><p>  string ippre

11、 = ipcur.Substring(0,ipdot+1);</p><p>  for (int i = 0; i <= 3;i++ )</p><p><b>  {</b></p><p>  MessageBox.Show("開始搜索");</p><p>  string scanip

12、 = ippre + i.ToString();</p><p>  IPAddress myscanip = IPAddress.Parse(scanip); </p><p>  IPHostEntry myscanhost = null;</p><p><b>  try </b></p><p><b&g

13、t;  { </b></p><p>  myscanhost = Dns.GetHostByAddress(myscanip); </p><p><b>  } </b></p><p><b>  catch </b></p><p><b>  { </b>

14、</p><p>  continue; </p><p><b>  }</b></p><p>  if (myscanhost.HostName != null)</p><p><b>  {</b></p><p>  MessageBox.Show("搜

15、索到一個結(jié)果");</p><p>  this.ipbox.Items.Add("可用IP:");</p><p>  this.ipbox.Items.Add(scanip);</p><p>  this.ipbox.Items.Add("此IP的主機(jī)名:");</p><p>  th

16、is.ipbox.Items.Add(myscanhost.HostName);</p><p><b>  } </b></p><p><b>  運(yùn)行截圖: </b></p><p>  在程序啟動時同時啟動另一個線程作為服務(wù)器</p><p>  C/S模式都有服務(wù)器和客戶端之分,在這

17、個程序中服務(wù)器端被簡化了,服務(wù)器程序不具有主動的功能,只能對端口進(jìn)行監(jiān)聽并且修改主進(jìn)程的控件。</p><p>  private void Form1_Load(object sender, EventArgs e)</p><p><b>  {</b></p><p>  Control.CheckForIllegalCrossThrea

18、dCalls = false;</p><p>  Thread server = new Thread(new ThreadStart(serverfuntion));</p><p>  server.IsBackground = true;</p><p>  server.Start();</p><p><b>  }&l

19、t;/b></p><p>  private void serverfuntion()</p><p><b>  {</b></p><p>  DateTime dt = new DateTime();</p><p>  dt = DateTime.Now;</p><p>  if

20、 (this.scanedip.Text != null)</p><p><b>  {</b></p><p>  TcpListener mylis = new TcpListener(IPAddress.Any, 51888);</p><p>  mylis.Start();</p><p>  while (

21、true)</p><p><b>  {</b></p><p>  TcpClient mytcp = new TcpClient();</p><p>  mytcp = mylis.AcceptTcpClient();// MessageBox.Show("連接建立成功!");</p><p>

22、;  NetworkStream mystream = mytcp.GetStream();</p><p>  StreamReader sr = new StreamReader(mystream); // MessageBox.Show("流建立成功!");</p><p>  string received = "";</p>

23、<p>  received = sr.ReadToEnd();// MessageBox.Show("消息接受成功!");</p><p>  if (received != null)</p><p><b>  {</b></p><p>  this.messagegeted.Items.Add(dt);&

24、lt;/p><p>  this.messagegeted.Items.Add(received);</p><p>  }//MessageBox.Show("文本框修改成功!");</p><p>  sr.Close();</p><p>  mystream.Close();</p><p> 

25、 mytcp.Close();//MessageBox.Show("流關(guān)閉,連接關(guān)閉!");</p><p><b>  }</b></p><p><b>  }</b></p><p>  連接指定IP地址,并且進(jìn)行數(shù)據(jù)傳輸</p><p><b>  連接指定IP

26、</b></p><p>  private void button2_Click(object sender, EventArgs e)</p><p><b>  {</b></p><p>  IPAddress myip = IPAddress.Parse(this.localip.Text.ToString());<

27、/p><p>  IPAddress toip = IPAddress.Parse(this.scanedip.Text.ToString());</p><p>  TcpClient mytcp = new TcpClient();</p><p><b>  try </b></p><p><b>  {

28、</b></p><p>  mytcp.Connect(toip, 51888); </p><p><b>  }</b></p><p>  catch (SocketException) </p><p><b>  { </b></p><p>  Me

29、ssageBox.Show("該IP不存在!"); </p><p><b>  }</b></p><p>  this.connectinfo.Items.Add("正在連接IP:");</p><p>  this.connectinfo.Items.Add(toip);</p>&l

30、t;p>  if (mytcp.Connected == true)</p><p><b>  {</b></p><p>  this.connectinfo.Items.Add("連接成功!");</p><p>  this.send.Enabled = true;</p><p>  

31、mytcp.Close();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  this.connectinfo.Items.Add("連接失?。?quot;);</

32、p><p>  this.send.Enabled = false;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  運(yùn)行截圖:</b></p><p><b>  數(shù)據(jù)傳輸</b&

33、gt;</p><p>  private void send_Click(object sender, EventArgs e)</p><p><b>  {</b></p><p>  DateTime dt = new DateTime();</p><p>  dt = DateTime.Now;</p&

34、gt;<p>  IPAddress myip = IPAddress.Parse(this.localip.Text.ToString());</p><p>  IPAddress toip = IPAddress.Parse(this.scanedip.Text.ToString());</p><p>  TcpClient mytcp = new TcpClient

35、();</p><p>  mytcp.Connect(toip,51888);//MessageBox.Show("連接建立!");</p><p>  NetworkStream mystream = mytcp.GetStream();//數(shù)據(jù)流建立</p><p>  string message1 = this.sendmessage.

36、Text;</p><p>  string message2 = this.localip.Text;</p><p>  string message3 = message1 + " 本條消息來自于:" + message2;</p><p>  string message4 = "你悄悄的對" + this.scan

37、edip.Text + "說:" + message1;</p><p>  this.messagegeted.Items.Add(dt);</p><p>  this.messagegeted.Items.Add(message4);</p><p>  byte[] sendmessage1 = System.Text.Encoding.

38、UTF8.GetBytes(message3);</p><p>  mystream.Write(sendmessage1,0,sendmessage1.Length);</p><p>  mystream.Close();//關(guān)閉數(shù)據(jù)流</p><p>  mytcp.Close();//關(guān)閉連接</p><p>  this.send

39、message.Clear();//MessageBox.Show("消息發(fā)送成功!");</p><p><b>  }</b></p><p><b>  運(yùn)行截圖:</b></p><p><b>  課程設(shè)計過程總結(jié)</b></p><p><

40、b>  程序總結(jié)</b></p><p>  程序?qū)崿F(xiàn)的功能比較簡單,只有搜索IP和點(diǎn)對點(diǎn)聊天,其中搜索IP速度很慢,大概要用3秒左右才能搜索一個IP,暫時還沒有解決這個問題,總體上達(dá)到了課程設(shè)計的目標(biāo),要求的功能基本都實(shí)現(xiàn)了。在后續(xù)的功能增強(qiáng)中,會逐步添加群聊還有添加好友的功能,登錄界面也要用數(shù)據(jù)庫進(jìn)行管理,依靠每個人的數(shù)據(jù)庫數(shù)據(jù)有不同的登錄界面和好友。</p><p>

41、;  遇到的問題和解決過程</p><p>  遇到的問題主要是兩個,一個是C/S模式都是要一個客戶端一個服務(wù)端,如何讓他們在一個程序中實(shí)現(xiàn);一個是對TCPCLIENT的使用不太熟悉,之前沒有用到過。對于TCPCLIENT的學(xué)習(xí)是自己找資料還有在網(wǎng)上看實(shí)例學(xué)會的,當(dāng)時和SOCKET有點(diǎn)弄混了,所以在剛開始的時候出了點(diǎn)小問題,隨著對tcpclient的理解的加深問題就解決了。另外一個問題是用線程來解決的,這個方法是

42、參考了網(wǎng)上的高手給的辦法,但是用線程是不能更改主線程的控件的,還要加上一句類似聲明的代碼,這一句代碼看似簡單,實(shí)際上我找到代碼并且測試成功用了將近一個小時的時間。在發(fā)現(xiàn)問題,解決問題的過程中,我的知識儲備也是愈加的豐富,在和同學(xué)們的交流中也學(xué)習(xí)到了很多知識和很多很好的想法。</p><p>  在這里對191072班的劉錦權(quán)同學(xué)提出特別感謝,他教給我線程和事件的使用方法。</p><p>

43、<b>  課程設(shè)計感想</b></p><p>  通過幾天緊張有序的忙碌,網(wǎng)絡(luò)課程設(shè)計程序終于出爐了?;谖覀冎皩CP的學(xué)習(xí)和理解,加上在自己買的資料中進(jìn)行學(xué)習(xí),在程序中應(yīng)用TCP連接還是不太難的。TCP強(qiáng)大的功能和使之實(shí)現(xiàn)的簡潔的代碼給我留下了很深刻的印象,在以后的學(xué)習(xí)生活中還要進(jìn)一步進(jìn)行學(xué)習(xí)。這一次網(wǎng)絡(luò)課程設(shè)計深化了我對TCP的理解,也對經(jīng)常要使用的C/S模式有了一定的了解,鍛煉

44、了C++的編程動手能力,有很強(qiáng)的成就感。TCP作為連接控件應(yīng)用非常廣泛,前景非常好,我會以這次課程設(shè)計為契機(jī),進(jìn)一步對TCP知識進(jìn)行學(xué)習(xí)和發(fā)掘。對我而言,知識上的收獲重要,精神上的豐收更加可喜。讓我知道了學(xué)無止境的道理,這次課程設(shè)計必將成為我人生旅途上一個非常美好的回憶!</p><p><b>  附錄</b></p><p><b>  日志:</

45、b></p><p>  第一天:題目解讀,基本思路。通過對課設(shè)題目的理解,用c#來做界面會好看一些,控件比較好用, tcp連接來做網(wǎng)絡(luò)的連接和數(shù)據(jù)傳輸,這個程序使用的是傳統(tǒng)的C/S模式,所以要寫兩個程序,服務(wù)端不斷掃描端口,客戶端連接并傳輸,爭取可以用一個程序來完成兩個程序的任務(wù)。今天主要寫了獲取本機(jī)ip和掃描指定區(qū)域ip。</p><p>  第二天:寫基本功能。學(xué)習(xí)tcpcli

46、ent的一系列操作后,寫出網(wǎng)絡(luò)連接和數(shù)據(jù)流,主要實(shí)現(xiàn)連接和對單人數(shù)據(jù)傳輸。</p><p>  第三天:測試連接,寫界面,增加其他的功能。測試連接可以正常傳輸信息,主要功能已經(jīng)實(shí)現(xiàn)了,把連接的IP寫到界面上變成可更改的數(shù)據(jù),在界面上添加控件顯示連接信息和聊天信息,搜索IP后對控件數(shù)據(jù)進(jìn)行添加,可以顯示可以搜索到的IP,增加搜索局域網(wǎng)功能。</p><p>  第四天:更正邏輯錯誤,在不同機(jī)

47、器上測試程序,補(bǔ)寫程序注釋。更正了一些釋放連接和數(shù)據(jù)的小錯誤,在宿舍局域網(wǎng)內(nèi)測試程序通過,可以正常實(shí)現(xiàn)所有功能。然后給程序重要部分寫上注釋和自己的理解,程序完成!</p><p><b>  源程序:</b></p><p>  using System;</p><p>  using System.Collections.Generic;&

48、lt;/p><p>  using System.ComponentModel;</p><p>  using System.Data;</p><p>  using System.Drawing;</p><p>  using System.Linq;</p><p>  using System.Text;<

49、;/p><p>  using System.Windows.Forms;</p><p>  using System.Net;</p><p>  using System.Net.Sockets;</p><p>  using System.Collections;</p><p>  using System.T

50、hreading;</p><p>  using System.IO;</p><p>  using System.Drawing;</p><p>  namespace 點(diǎn)對點(diǎn)聊天</p><p><b>  {</b></p><p>  public partial class For

51、m1 : Form</p><p><b>  {</b></p><p>  public Form1()</p><p><b>  {</b></p><p>  InitializeComponent();</p><p><b>  }</b>

52、</p><p>  private void getlanip_Click(object sender, EventArgs e)</p><p><b>  {</b></p><p>  string hostname1 = Dns.GetHostName();</p><p>  IPHostEntry myen

53、try = Dns.GetHostByName(hostname1);</p><p>  IPAddress myaddress = new IPAddress(myentry.AddressList[0].Address);</p><p>  string myip = myaddress.ToString();</p><p>  int ipdot = m

54、yip.LastIndexOf('.');</p><p>  myip = myip.Substring(0,ipdot+1);</p><p>  string aa = "0";</p><p>  string bb = "255";</p><p>  string start

55、ip = myip + aa;</p><p>  string endip = myip + bb;</p><p>  this.ipstart.Text = startip;</p><p>  this.ipend.Text = endip;</p><p><b>  }</b></p><

56、p>  private void button1_Click(object sender, EventArgs e)</p><p><b>  {</b></p><p>  string ipcur = this.ipstart.Text;</p><p>  int ipdot = ipcur.LastIndexOf('.&

57、#39;);</p><p>  string ippre = ipcur.Substring(0,ipdot+1);</p><p>  for (int i = 0; i <= 3;i++ )</p><p><b>  {</b></p><p>  MessageBox.Show("開始搜索&qu

58、ot;);</p><p>  string scanip = ippre + i.ToString();</p><p>  IPAddress myscanip = IPAddress.Parse(scanip); </p><p>  IPHostEntry myscanhost = null;</p><p><b>  t

59、ry </b></p><p><b>  { </b></p><p>  myscanhost = Dns.GetHostByAddress(myscanip); </p><p><b>  } </b></p><p><b>  catch </b><

60、;/p><p><b>  { </b></p><p>  continue; </p><p><b>  }</b></p><p>  if (myscanhost.HostName != null)</p><p><b>  {</b></

61、p><p>  MessageBox.Show("搜索到一個結(jié)果");</p><p>  this.ipbox.Items.Add("可用IP:");</p><p>  this.ipbox.Items.Add(scanip);</p><p>  this.ipbox.Items.Add("

62、此IP的主機(jī)名:");</p><p>  this.ipbox.Items.Add(myscanhost.HostName);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

63、<p>  private void Form1_Load(object sender, EventArgs e)</p><p><b>  {</b></p><p>  string hostname1 = Dns.GetHostName();</p><p>  IPHostEntry myentry = Dns.GetH

64、ostByName(hostname1);</p><p>  IPAddress myaddress = new IPAddress(myentry.AddressList[0].Address);</p><p>  string myip = myaddress.ToString();</p><p>  this.localip.Text = myip;&l

65、t;/p><p>  this.send.Enabled = false;</p><p>  Control.CheckForIllegalCrossThreadCalls = false;</p><p>  Thread server = new Thread(new ThreadStart(serverfuntion));</p><p>

66、;  server.IsBackground = true;</p><p>  server.Start();</p><p><b>  }</b></p><p>  private void serverfuntion()</p><p><b>  {</b></p><

67、;p>  DateTime dt = new DateTime();</p><p>  dt = DateTime.Now;</p><p>  if (this.scanedip.Text != null)</p><p><b>  {</b></p><p>  TcpListener mylis = ne

68、w TcpListener(IPAddress.Any, 51888);</p><p>  mylis.Start();</p><p>  while (true)</p><p><b>  {</b></p><p>  TcpClient mytcp = new TcpClient();</p>

69、<p>  mytcp = mylis.AcceptTcpClient();</p><p>  // MessageBox.Show("連接建立成功!");</p><p>  NetworkStream mystream = mytcp.GetStream();</p><p>  StreamReader sr = new Str

70、eamReader(mystream);</p><p>  // MessageBox.Show("流建立成功!");</p><p>  string received = "";</p><p>  received = sr.ReadToEnd();</p><p>  // MessageBo

71、x.Show("消息接受成功!");</p><p>  if (received != null)</p><p><b>  {</b></p><p>  this.messagegeted.Items.Add(dt);</p><p>  this.messagegeted.Items.Add

72、(received);</p><p><b>  }</b></p><p>  //MessageBox.Show("文本框修改成功!");</p><p>  sr.Close();</p><p>  mystream.Close();</p><p>  mytcp.

73、Close();</p><p>  //MessageBox.Show("流關(guān)閉,連接關(guān)閉!");</p><p><b>  }</b></p><p><b>  }</b></p><p>  private void button2_Click(object sende

74、r, EventArgs e)</p><p><b>  {</b></p><p>  IPAddress myip = IPAddress.Parse(this.localip.Text.ToString());</p><p>  IPAddress toip = IPAddress.Parse(this.scanedip.Text.T

75、oString());</p><p>  TcpClient mytcp = new TcpClient();</p><p><b>  try </b></p><p><b>  { </b></p><p>  mytcp.Connect(toip, 51888); </p>

76、<p><b>  }</b></p><p>  catch (SocketException) </p><p><b>  { </b></p><p>  MessageBox.Show("該IP不存在!"); </p><p><b>  }<

77、;/b></p><p>  this.connectinfo.Items.Add("正在連接IP:");</p><p>  this.connectinfo.Items.Add(toip);</p><p>  if (mytcp.Connected == true)</p><p><b>  {&l

78、t;/b></p><p>  this.connectinfo.Items.Add("連接成功!");</p><p>  this.send.Enabled = true;</p><p>  mytcp.Close();</p><p><b>  }</b></p><

79、;p><b>  else</b></p><p><b>  {</b></p><p>  this.connectinfo.Items.Add("連接失??!");</p><p>  this.send.Enabled = false;</p><p><b&g

80、t;  }</b></p><p><b>  }</b></p><p>  private void send_Click(object sender, EventArgs e)</p><p><b>  {</b></p><p>  DateTime dt = new Date

81、Time();</p><p>  dt = DateTime.Now;</p><p>  IPAddress myip = IPAddress.Parse(this.localip.Text.ToString());</p><p>  IPAddress toip = IPAddress.Parse(this.scanedip.Text.ToString())

82、;</p><p>  TcpClient mytcp = new TcpClient();</p><p>  mytcp.Connect(toip,51888);//MessageBox.Show("連接建立!");</p><p>  NetworkStream mystream = mytcp.GetStream();//數(shù)據(jù)流建立<

83、;/p><p>  string message1 = this.sendmessage.Text;</p><p>  string message2 = this.localip.Text;</p><p>  string message3 = message1 + " 本條消息來自于:" + message2;</p><

84、;p>  string message4 = "你悄悄的對" + this.scanedip.Text + "說:" + message1;</p><p>  this.messagegeted.Items.Add(dt);</p><p>  this.messagegeted.Items.Add(message4);</p>

85、<p>  byte[] sendmessage1 = System.Text.Encoding.UTF8.GetBytes(message3);</p><p>  mystream.Write(sendmessage1,0,sendmessage1.Length);</p><p>  mystream.Close();//關(guān)閉數(shù)據(jù)流</p><p>

86、;  mytcp.Close();//關(guān)閉連接</p><p>  this.sendmessage.Clear();//MessageBox.Show("消息發(fā)送成功!");</p><p><b>  }</b></p><p><b>  }</b></p><p><

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論