創作內容

14 GP

C# TCP/IP 連線 (TCP Client)

作者:貓貓風 ฅ●ω●ฅ│2017-02-02 13:36:52│巴幣:76│人氣:21576
.

















網路連線算是很常使用的功能之一,最普遍的連線方式非TCP/IP莫屬,它的架構主要分為兩部分,Client與Server,Client端主要負責送出請求,Server端主要負責接收從Client端送來的請求。
 
以下範例為簡單的TCP/IP連線程式,使用本機端(127.0.0.1做測試)
 
Client端
 

  1. using System;  
  2. usingSystem.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. usingSystem.Windows.Forms;  
  9. using System.IO;  
  10. using System.Net;  
  11. usingSystem.Net.Sockets;  
  12. namespace TCP_client  
  13. {  
  14.         public partial class Form1 : Form  
  15.         {  
  16.          TcpClientclient;  
  17.          NetworkStream stream;  
  18.                 public Form1()  
  19.                 {  
  20.                         InitializeComponent();  
  21.                 }  
  22.                 private voidbutton1_Click(object sender, EventArgs e)  
  23.                 {  
  24.                         try  
  25.                          {  
  26.                             // 建立 TcpClient連線  
  27.                                 Int32 port =13000;  
  28.                                 client = newTcpClient("127.0.0.1", port);        
  29.                           }  
  30.                           catch (ArgumentNullException A)  
  31.                           {  
  32.                                 MessageBox.Show("ArgumentNullException:{0}"+ A);  
  33.                           }  
  34.                           catch (SocketException S)  
  35.                           {  
  36.                                   MessageBox.Show("SocketException:{0}"+ S);  
  37.                           }  
  38.                         }  
  39.                 private void button2_Click(objectsender, EventArgs e)  
  40.                 {  
  41.                  Byte[] data =System.Text.Encoding.Unicode.GetBytes(richTextBox1.Text);  
  42.                  //把傳輸的資料轉成unicode並用byte陣列儲存  
  43.                         try  
  44.                         {  
  45.                         stream =client.GetStream(); // 取得clientstream  
  46.                         stream.Write(data, 0,data.Length);     
  47.                         //把資料傳到已連接的TcpServer  
  48.                         }  
  49.                         catch(Exception)  
  50.                         {  
  51.                          MessageBox.Show("未連線");  
  52.                         }  
  53.                 }  
  54.                 private voidbutton3_Click(object sender, EventArgs e)  
  55.                 {  
  56.                         Byte[] data=System.Text.Encoding.Unicode.GetBytes("disconnect");  
  57.                         // 取得client stream.  
  58.                         stream =client.GetStream();  
  59.                         // 送 disconnect 資料給 TcpServer.  
  60.                         stream.Write(data, 0,data.Length);  
  61.                         // 關閉串流與連線  
  62.                         stream.Close();  
  63.                         client.Close();           
  64.                 }  
  65.              }  
  66.         }  



Server


  1. using System;  
  2. usingSystem.Collections.Generic;  
  3. usingSystem.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. usingSystem.Windows.Forms;  
  9. using System.IO;  
  10. using System.Net;  
  11. usingSystem.Net.Sockets;  
  12. usingSystem.Threading;  
  13. namespace TCP_server  
  14. {  
  15.         public partial class Form1 : Form  
  16.         {  
  17.          int UI_stas=1; //判斷UI狀態  
  18.          enum E { waiting = 1, connected = 2, display =3, disconnected = 4 }  
  19.          //列舉判斷代碼,方便辨識  
  20.          List<string> _Ls = newList<string>();  
  21.                 public Form1()  
  22.                 {  
  23.                         InitializeComponent();  
  24.                 }  
  25.                 private void getData()  
  26.                 {  
  27.                   TcpListener server = null;  
  28.                         try  
  29.                         {  
  30.                                 // 設置 TcpListener port 13000.  
  31.                                 Int32 port =13000;  
  32.                                 IPAddresslocalAddr = IPAddress.Parse("127.0.0.1");  
  33.                                 server = newTcpListener(localAddr, port);
  34.                                 //建立新的TcpListener  
  35.                                 server.Start();//開始監聽client的請求  
  36.                                 Byte[] bytes =new Byte[256]; //建立buffer來讀取資料  
  37.                                 String data =null;  
  38.                                 // 進入監聽迴圈  
  39.                                 while (true)  
  40.                                 {  
  41.                                         UI_stas= Convert.ToInt32(E.waiting);  
  42.                                         backgroundWorker1.ReportProgress(UI_stas);  
  43.                                         //傳入一個變數訊息給ReportProgress借以改變UI  
  44.                                         //,直接在執行緒修改UI是不被允許  
  45.                                         TcpClientclient = server.AcceptTcpClient();  
  46.                                        //接收client端的請求  
  47.                                         UI_stas= Convert.ToInt32(E.connected);  
  48.                                         backgroundWorker1.ReportProgress(UI_stas);  
  49.                           
  50.                                         data =null;  
  51.                                         NetworkStreamstream = client.GetStream();  
  52.                                         //取得client傳過來的資料  
  53.                                         int i;  
  54.                                         // 開始接收 client 的資料  
  55.                                         while((i = stream.Read(bytes, 0, bytes.Length)) != 0)  
  56.                                         {  
  57.                                         data =System.Text.Encoding.Unicode.GetString(bytes, 0, i);  
  58.                                         UI_stas= Convert.ToInt32(E.display);  
  59.                                         if(data!="disconnect")  
  60.                                         {  
  61.                                                 _Ls.Add(data);//接收到的資存入List  
  62.                                         }  
  63.                                                 backgroundWorker1.ReportProgress(UI_stas,data);  
  64.                                         }  
  65.                                         UI_stas= Convert.ToInt32(E.disconnected);  
  66.                                         backgroundWorker1.ReportProgress(UI_stas);  
  67.                                         client.Close();  
  68.                                 }  
  69.                         }  
  70.                         catch (SocketExceptione)  
  71.                         {  
  72.                                 MessageBox.Show("SocketException:{0}"+e);  
  73.                         }  
  74.                         finally //釋放區塊  
  75.                         {  
  76.                                 server.Stop();//停止監聽clients  
  77.                         }  
  78.               }  
  79.       
  80.                 private void Form1_Load(objectsender, EventArgs e)  
  81.                 {  
  82.                         backgroundWorker1.RunWorkerAsync();    
  83.                         //監聽的部分一定放在執行緒,否則在while迴圈時會一直等待當掉  
  84.                 }  
  85.                 private voidbackgroundWorker1_DoWork(object sender,    
  86.                 DoWorkEventArgs e)  
  87.                 {  
  88.                         getData();  
  89.                 }  
  90.                 private voidbackgroundWorker1_RunWorkerCompleted(object sender,  
  91.                 RunWorkerCompletedEventArgs e)  
  92.                 {  
  93.                         MessageBox.Show("OK");  
  94.                 }  
  95.                 private voidbackgroundWorker1_ProgressChanged(object sender,         
  96.                 ProgressChangedEventArgs e) //此部分為看接收值改變UI  
  97.                 {  
  98.                  if(e.ProgressPercentage==(int)E.waiting)  
  99.                  {  
  100.                         label1.Text =("Waiting for a connection... ");  
  101.                  }  
  102.                  else if (e.ProgressPercentage ==(int)E.connected)  
  103.                  {  
  104.                  if(e.ProgressPercentage!=(int)E.disconnected)  
  105.                     {  
  106.                         label2.Text =("Connected!");  
  107.                         }  
  108.                 }  
  109.             else if (e.ProgressPercentage ==
  110.            (int)E.display && e.UserState.ToString() !=       
  111.            "disconnect")  
  112.            {  
  113.                         richTextBox1.Text="";  
  114.                         foreach(string data in_Ls)  
  115.                          {  
  116.                           richTextBox1.Text+=data;  
  117.                          }       
  118.                 }  
  119.                 if(e.ProgressPercentage==(int)E.disconnected)  
  120.                 {  
  121.                         label2.Text =("disonnected!");  
  122.                 }  
  123.             }  
  124.         }  
  125.    }  




執行步驟
 
1.    建立連線



2.    傳送資料



3.    接收完資料斷開連線


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3466685
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風|C#

留言共 15 篇留言

克利絲提亞
貓咪妳好厲害喔~(。・ω・。)ノ♡

02-02 13:55

貓貓風 ฅ●ω●ฅ
還好 > <02-02 13:57
Drew
謝啦,最近剛好在研究TCP/IP,很好的範例喔!

03-16 13:24

貓貓風 ฅ●ω●ฅ
[e34]03-16 21:04
癢癢
謝謝你的範例,想請問一個問題
backgroundWorker1 是從哪裡出來的
錯誤訊息錯誤backgroundWorker1不存在於目前內容中
感謝回答

06-15 14:08

貓貓風 ฅ●ω●ฅ
元件那邊可以選06-15 18:59
癢癢
謝謝回覆,你的文章讓我受益良多,希望能多發c#文章讓小弟學習!

06-16 08:54

貓貓風 ฅ●ω●ฅ
謝謝捧場喔 你客氣了07-08 20:56
不明人士
大大你好 希望可以幫我一下 基本上是照抄
可是出現這個問題 http://imgur.com/a/FwDXy

08-14 15:18

貓貓風 ฅ●ω●ฅ
backgroundworker那屬性去修改08-14 21:27
不明人士
謝謝 上面那問題解決了
不好意思 現在又出現http://imgur.com/a/qH5W0

08-15 15:16

貓貓風 ฅ●ω●ฅ
可能 Client 或 Server端有一端斷線了08-15 22:28
貓貓風 ฅ●ω●ฅ
或是重複連線08-15 22:29
阿泰
請問一下 https://imgur.com/o1kL6L3
如果出現 無法連線,因為目標電腦拒絕連線。
這種情況要怎麼去解決?

08-11 13:21

貓貓風 ฅ●ω●ฅ
有沒有可能事防火牆問題?08-11 22:39
阿泰
我已經將防火牆關掉了,但是還是會出現無法連線的問題
還是說backgroundWorker1_RunWorkerCompleted跟backgroundWorker1_ProgressChanged
這兩個元件我沒有丟到Form裡面?這兩個是我在.cs檔直接用打出來的,而導致無法連線的問題?

08-12 10:55

貓貓風 ฅ●ω●ฅ
你原件要設定啟用 他預設好像事 disable08-12 21:19
貓貓風 ฅ●ω●ฅ
那兩個元件要從圖控拖曳到form裡08-12 21:20
阿泰
Runwork跟Progress 這兩個元件我沒辦法從工具箱找到,我也找試著額外增加這兩個元件但還是沒有

08-12 23:06

貓貓風 ฅ●ω●ฅ
Runwork跟Progress是屬性08-13 00:39
阿泰
Backwork的屬性那邊我有把false改成True,不知道是不是原po所指的這樣子

08-12 23:09

貓貓風 ฅ●ω●ฅ
08-13 00:39
阿泰
https://imgur.com/KEhgHgY
https://imgur.com/doY2a5B
https://imgur.com/J4S1Ace
在非同步這邊我有將WorkReprotsProgress,WorkSupportsCancellation 這兩個有從False改成true過,但是還是沒辦法
我有在private void backgroundWorker1_DoWork(object sender,DoWorkEventArgs e)
{
Console.WriteLine("123");
getData();

}
之中加入console.writeline來偵測有無執行,但是發現都沒辦法執行這項動作

08-13 10:40

貓貓風 ฅ●ω●ฅ
backgroundWorker1_DoWork 這段要用系統產生的 不要直接複製貼上 在 Event那邊點兩下,讓系統自己產生08-13 19:23
阿泰
在重新開一個專案重新將ReprotsProgress.ProgressChanged從屬性匯進.cs檔
接著再把WorkerReprotsProgre從False改成True,就可以了[e12]
不過我有些好奇,原本就有的worker得這兩個直接複製貼上為什麼沒辦法執行成功?

08-14 10:40

貓貓風 ฅ●ω●ฅ
因為外部匯進來的,有些編譯環境會認不得08-15 01:08
西門吹雪
感恩大大的範例

12-09 00:12

貓貓風 ฅ●ω●ฅ
[e34]12-09 00:15
綠水靈
請問貓大 server端有沒有辦法回傳訊息到客戶端QQ

08-11 15:52

貓貓風 ฅ●ω●ฅ
應該是防火牆問題08-11 19:18
綠水靈
我現在可以正常運作貓大您的程式,可是我想問有沒有辦法讓客戶端可以跟server端聊天的感覺,或是有沒有相關資訊可以拜讀,目前新手,感覺這篇寫最好,所以想向貓大請教。

08-12 10:28

貓貓風 ฅ●ω●ฅ
參考這篇看看 http://ccckmit.wikidot.com/code:chattingroom08-12 10:32
我要留言提醒:您尚未登入,請先登入再留言

14喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:C# 執行緒帶參數方法... 後一篇:C# TCP/IP (T...

追蹤私訊切換新版閱覽

作品資料夾

ilove487
關於人生第二本小說被翻譯成日文的這件事【角川/角角者】看更多我要大聲說昨天11:00


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】