C#基於TCP協議的簡單通信程序

 今天仔細研究了一下Learning hard Learning hard的博客《C#網絡編程系列五:TCP編程》,就花了一下午的時間重敲了一下上面的代碼,加深了對運輸層TCP協議的瞭解,詳細的關於TCP的介紹,請大家看上面的博客,裏面有詳細的介紹,俺是個菜鳥,處於學習階段,就不班門弄斧了

  下面我把我花了一下午重寫的代碼貼到下面,供大家參考,有什麼意見請指出,不勝感激

TCP客戶端

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.ComponentModel; 
  4. using System.Data; 
  5. using System.Drawing; 
  6. using System.Linq; 
  7. using System.Text; 
  8. using System.Windows.Forms; 
  9. using System.Net.Sockets; 
  10. using System.IO; 
  11. using System.Net; 
  12. using System.Threading; 
  13. namespace Tcp客戶端 
  14.     public partial class Form1 : Form 
  15.     { 
  16.         #region 變量定義 
  17.         //聲明變量 
  18.         private TcpClient tcpClient = null
  19.         private NetworkStream networkStream = null
  20.         private BinaryReader reader; 
  21.         private BinaryWriter writer; 
  22.  
  23.         //申明委託 
  24.         //顯示消息 
  25.         private delegate void ShowMessage(string str); 
  26.         private ShowMessage showMessageCallback; 
  27.         //申明委託 
  28.         //顯示狀態 
  29.         private delegate void ShowStatus(string str); 
  30.         private ShowStatus showStatusCallback; 
  31.         //申明委託 
  32.         //清空消息 
  33.         private delegate void ResetMessage(); 
  34.         private ResetMessage resetMessageCallback; 
  35.         #endregion 
  36.  
  37.         public Form1() 
  38.         { 
  39.             InitializeComponent(); 
  40.             //顯示消息 
  41.             showMessageCallback = showMessage; 
  42.             //顯示狀態 
  43.             showStatusCallback = showStatus; 
  44.             //清空消息 
  45.             resetMessageCallback = resetMessage; 
  46.         } 
  47.         #region 定義委託函數 
  48.         //顯示消息 
  49.         private void showMessage(string str) 
  50.         { 
  51.             lbMessageView.Items.Add(tcpClient.Client.RemoteEndPoint); 
  52.             lbMessageView.Items.Add(str); 
  53.             lbMessageView.TopIndex = lbMessageView.Items.Count - 1; 
  54.         } 
  55.         //顯示狀態 
  56.         private void showStatus(string str) 
  57.         { 
  58.             toolStripStatusLabel1.Text = str; 
  59.         } 
  60.         //清空消息 
  61.         private void resetMessage() 
  62.         { 
  63.             tbMessage.Text = ""
  64.             tbMessage.Focus(); 
  65.         } 
  66.         #endregion 
  67.  
  68.         //建立連接 
  69.         private void btnConnection_Click(object sender, EventArgs e) 
  70.         { 
  71.             // 通過一個線程發起請求,多線程 
  72.             Thread connectThread = new Thread(ConnectToServer); 
  73.             connectThread.Start(); 
  74.         } 
  75.         private void ConnectToServer() 
  76.         { 
  77.             try 
  78.             { 
  79.                 //調用委託 
  80.                 statusStrip1.Invoke(showStatusCallback, "正在連接……"); 
  81.                 if (txtIP.Text == string.Empty || txtPort.Text == string.Empty) 
  82.                 { 
  83.                     MessageBox.Show("請先輸入服務器的IP地址和端口號"); 
  84.                 } 
  85.                 IPAddress ipaddress = IPAddress.Parse(txtIP.Text); 
  86.                 tcpClient = new TcpClient(); 
  87.                 tcpClient.Connect(ipaddress, int.Parse(txtPort.Text)); 
  88.                 //延時操作 
  89.                 Thread.Sleep(1000); 
  90.                 if (tcpClient != null
  91.                 { 
  92.                     statusStrip1.Invoke(showStatusCallback, "連接成功"); 
  93.                     networkStream = tcpClient.GetStream(); 
  94.                     reader = new BinaryReader(networkStream); 
  95.                     writer = new BinaryWriter(networkStream); 
  96.                 } 
  97.             } 
  98.             catch 
  99.             { 
  100.                 statusStrip1.Invoke(showStatusCallback, "連接失敗"); 
  101.                 Thread.Sleep(1000); 
  102.                 statusStrip1.Invoke(showStatusCallback, "就緒"); 
  103.             } 
  104.         } 
  105.         //斷開連接 
  106.         private void btnDisconnect_Click(object sender, EventArgs e) 
  107.         { 
  108.             if (reader != null
  109.             { 
  110.                 reader.Close(); 
  111.             } 
  112.             if (writer != null
  113.             { 
  114.                 writer.Close(); 
  115.             } 
  116.             if (tcpClient != null
  117.             { 
  118.                 // 斷開連接 
  119.                 tcpClient.Close(); 
  120.             } 
  121.  
  122.             toolStripStatusLabel1.Text = "斷開連接"
  123.         } 
  124.         //接受消息 
  125.         private void btnRecev_Click(object sender, EventArgs e) 
  126.         { 
  127.             Thread receiveThread = new Thread(receiveMessage); 
  128.             receiveThread.Start(); 
  129.         } 
  130.         private void receiveMessage() 
  131.         { 
  132.             statusStrip1.Invoke(showStatusCallback, "接受中"); 
  133.             try 
  134.             { 
  135.  
  136.                 string receivemessage = reader.ReadString(); 
  137.                 lbMessageView.Invoke(showMessageCallback, receivemessage); 
  138.             } 
  139.             catch 
  140.             { 
  141.                 if (reader != null
  142.                 { 
  143.                     reader.Close(); 
  144.                 } 
  145.                 if (writer != null
  146.                 { 
  147.                     writer.Close(); 
  148.                 } 
  149.                 if (tcpClient != null
  150.                 { 
  151.                     tcpClient.Close(); 
  152.                 } 
  153.  
  154.                 statusStrip1.Invoke(showStatusCallback, "斷開了連接"); 
  155.             } 
  156.         } 
  157.         //清除消息 
  158.         private void btnClear_Click(object sender, EventArgs e) 
  159.         { 
  160.             lbMessageView.Items.Clear(); 
  161.         } 
  162.         //發送消息 
  163.         private void btnSend_Click(object sender, EventArgs e) 
  164.         { 
  165.             Thread sendThread = new Thread(SendMessage); 
  166.             sendThread.Start(tbMessage.Text); 
  167.         } 
  168.         private void SendMessage(object state) 
  169.         { 
  170.             try 
  171.             { 
  172.                 statusStrip1.Invoke(showStatusCallback, "正在發送……"); 
  173.                 writer.Write(state.ToString()); 
  174.                 Thread.Sleep(3000); 
  175.                 writer.Flush(); 
  176.                 statusStrip1.Invoke(showStatusCallback, "完畢"); 
  177.  
  178.                 tbMessage.Invoke(resetMessageCallback, null); 
  179.                 lbMessageView.Invoke(showMessageCallback, state.ToString()); 
  180.             } 
  181.             catch 
  182.             { 
  183.                 if (reader != null
  184.                 { 
  185.                     reader.Close(); 
  186.                 } 
  187.                 if (writer != null
  188.                 { 
  189.                     writer.Close(); 
  190.                 } 
  191.                 if (tcpClient != null
  192.                 { 
  193.                     tcpClient.Close(); 
  194.                 } 
  195.  
  196.                 statusStrip1.Invoke(showStatusCallback, "斷開了連接"); 
  197.             } 
  198.         } 
  199.         //關閉 
  200.         private void btnClose_Click(object sender, EventArgs e) 
  201.         { 
  202.             this.Close(); 
  203.         } 
  204.     } 

TCP服務器 

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.ComponentModel; 
  4. using System.Data; 
  5. using System.Drawing; 
  6. using System.Linq; 
  7. using System.Text; 
  8. using System.Windows.Forms; 
  9. using System.Net.Sockets; 
  10. using System.Net; 
  11. using System.IO; 
  12. using System.Threading; 
  13.  
  14. namespace Tcp服務器 
  15.     public partial class Form1 : Form 
  16.     { 
  17.         #region 變量 
  18.         private const int Port = 51388; 
  19.         private TcpListener tcpListener = null
  20.         private TcpClient tcpClient = null
  21.         IPAddress ipaddress; 
  22.         private NetworkStream networkStream = null
  23.         private BinaryReader reader; 
  24.         private BinaryWriter writer; 
  25.         // 申明委託 
  26.         // 顯示消息 
  27.         private delegate void ShowMessage(string str); 
  28.         private ShowMessage showMessageCallback; 
  29.         // 申明委託 
  30.         // 顯示狀態 
  31.         private delegate void ShowStatus(string str); 
  32.         private ShowStatus showStatusCallBack; 
  33.         // 申明委託 
  34.         // 清空消息 
  35.         private delegate void ResetMessage(); 
  36.         private ResetMessage resetMessageCallBack; 
  37.  
  38.         #endregion 
  39.  
  40.         public Form1() 
  41.         { 
  42.             InitializeComponent(); 
  43.  
  44.             #region 實例化委託 
  45.             // 顯示消息 
  46.             showMessageCallback = showMessage; 
  47.  
  48.             // 顯示狀態 
  49.             showStatusCallBack = showStatus; 
  50.  
  51.             // 重置消息 
  52.             resetMessageCallBack = resetMessage; 
  53.             #endregion 
  54.  
  55.             ipaddress = IPAddress.Loopback; 
  56.             txtIP.Text = ipaddress.ToString(); 
  57.             txtPort.Text = Port.ToString(); 
  58.  
  59.         } 
  60.         #region 定義回調函數 
  61.  
  62.         // 顯示消息 
  63.         private void showMessage(string str) 
  64.         { 
  65.             lbMessageView.Items.Add(tcpClient.Client.RemoteEndPoint); 
  66.             lbMessageView.Items.Add(str); 
  67.             lbMessageView.TopIndex = lbMessageView.Items.Count - 1; 
  68.         } 
  69.  
  70.         // 顯示狀態 
  71.         private void showStatus(string str) 
  72.         { 
  73.             toolStripStatusLabel1.Text = str; 
  74.         } 
  75.  
  76.         // 清空消息 
  77.         private void resetMessage() 
  78.         { 
  79.             tbMessage.Text = string.Empty; 
  80.             tbMessage.Focus(); 
  81.         } 
  82.  
  83.         #endregion  
  84.  
  85.         //開始監聽 
  86.         private void btnStart_Click(object sender, EventArgs e) 
  87.         { 
  88.             tcpListener = new TcpListener(ipaddress, Port); 
  89.             tcpListener.Start(); 
  90.             //啓動一個線程來接受請求 
  91.             Thread acceptThread = new Thread(acceptClientConnect); 
  92.             acceptThread.Start(); 
  93.         } 
  94.         private void acceptClientConnect() 
  95.         { 
  96.             statusStrip1.Invoke(showStatusCallBack, "正在監聽……"); 
  97.             Thread.Sleep(1000); 
  98.             try 
  99.             { 
  100.                 statusStrip1.Invoke(showStatusCallBack, "等待連接"); 
  101.                 tcpClient = tcpListener.AcceptTcpClient(); 
  102.                 if (tcpListener != null
  103.                 { 
  104.                     statusStrip1.Invoke(showStatusCallBack, "接受到連接"); 
  105.                     networkStream = tcpClient.GetStream(); 
  106.                     reader = new BinaryReader(networkStream); 
  107.                     writer = new BinaryWriter(networkStream); 
  108.                 } 
  109.             } 
  110.             catch 
  111.             { 
  112.                 statusStrip1.Invoke(showStatusCallBack, "停止監聽"); 
  113.                 Thread.Sleep(1000); 
  114.                 statusStrip1.Invoke(showStatusCallBack, "就緒"); 
  115.             } 
  116.         } 
  117.         //關閉監聽 
  118.         private void btnStop_Click(object sender, EventArgs e) 
  119.         { 
  120.             tcpListener.Stop(); 
  121.         } 
  122.         //接受 
  123.         private void btnReceiv_Click(object sender, EventArgs e) 
  124.         { 
  125.             statusStrip1.Invoke(showStatusCallBack, "接受消息中"); 
  126.             try 
  127.             { 
  128.                 string receivemessage = reader.ReadString(); 
  129.                 lbMessageView.Invoke(showMessageCallback, receivemessage); 
  130.             } 
  131.             catch 
  132.             { 
  133.                 if (reader != null
  134.                 { 
  135.                     reader.Close(); 
  136.                 } 
  137.                 if (writer != null
  138.                 { 
  139.                     writer.Close(); 
  140.                 } 
  141.                 if (tcpClient != null
  142.                 { 
  143.                     tcpClient.Close(); 
  144.                 } 
  145.                 statusStrip1.Invoke(showStatusCallBack, "斷開了連接"); 
  146.                 Thread acceptThread = new Thread(acceptClientConnect); 
  147.                 acceptThread.Start(); 
  148.             } 
  149.         } 
  150.         //清空消息 
  151.         private void btnClear_Click(object sender, EventArgs e) 
  152.         { 
  153.             lbMessageView.Items.Clear(); 
  154.         } 
  155.         //發送 
  156.         private void btnSend_Click(object sender, EventArgs e) 
  157.         { 
  158.             Thread sendThread = new Thread(SendMessage); 
  159.             sendThread.Start(tbMessage.Text); 
  160.         } 
  161.         private void SendMessage(object state) 
  162.         { 
  163.             statusStrip1.Invoke(showStatusCallBack, "正在發送"); 
  164.             try 
  165.             { 
  166.                 writer.Write(state.ToString()); 
  167.                 Thread.Sleep(3000); 
  168.                 writer.Flush(); 
  169.                 statusStrip1.Invoke(showStatusCallBack, "完畢"); 
  170.                 tbMessage.Invoke(resetMessageCallBack, null); 
  171.                 lbMessageView.Invoke(showMessageCallback, state.ToString()); 
  172.             } 
  173.             catch 
  174.             { 
  175.                 if (reader != null
  176.                 { 
  177.                     reader.Close(); 
  178.                 } 
  179.                 if (writer != null
  180.                 { 
  181.                     writer.Close(); 
  182.                 } 
  183.                 if (tcpClient != null
  184.                 { 
  185.                     tcpClient.Close(); 
  186.                 } 
  187.  
  188.                 statusStrip1.Invoke(showStatusCallBack, "斷開了連接"); 
  189.                 // 重新開啓一個線程等待新的連接 
  190.                 Thread acceptThread = new Thread(acceptClientConnect); 
  191.                 acceptThread.Start();  
  192.             } 
  193.         } 
  194.  
  195.         //斷開連接 
  196.         private void btnDispose_Click(object sender, EventArgs e) 
  197.         { 
  198.             if (reader != null
  199.             { 
  200.                 reader.Close(); 
  201.             } 
  202.             if (writer != null
  203.             { 
  204.                 writer.Close(); 
  205.             } 
  206.             if (tcpClient != null
  207.             { 
  208.                 // 斷開連接 
  209.                 tcpClient.Close(); 
  210.             } 
  211.  
  212.             toolStripStatusLabel1.Text = "斷開連接"
  213.  
  214.             // 啓動一個線程等待接受新的請求 
  215.             Thread acceptThread = new Thread(acceptClientConnect); 
  216.             acceptThread.Start(); 
  217.         } 
  218.     } 

進行通信的時候,首先將TCP服務器端打開監聽,客戶端輸入IP地址和端口號進行連接,連接成功後就可以進行通信了

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章