C#聯(lián)合VisionPro實現TCP/IP通信詳解
TCP/IP(傳輸控制協(xié)議/互聯(lián)網協(xié)議)是一組用于在網絡上進行通信的通信協(xié)議。它是互聯(lián)網和許多局域網的基礎,為計算機之間的數據傳輸提供了可靠性、有序性和錯誤檢測。在軟件開發(fā)中,TCP/IP 通信通常用于實現網絡應用程序之間的數據交換。
基于 TCP/IP 的通信通常涉及以下幾個步驟:
1、建立連接: 通信雙方通過套接字(socket)建立連接。在 C# 中,你可以使用 TcpClient 類來創(chuàng)建一個 TCP 客戶端,并使用 TcpListener 類來創(chuàng)建一個 TCP 服務器端。
2、發(fā)送和接收數據: 一旦連接建立,通信雙方可以通過套接字發(fā)送和接收數據。在 C# 中,你可以使用 NetworkStream 類來發(fā)送和接收數據。
3、關閉連接: 在通信完成后,通信雙方可以通過關閉套接字來斷開連接,釋放資源。
代碼展示
using System; using System.Net; //引入支持socket的命名空間 using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace TCPIP通信 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //聲明socket需要支持的對象 public Socket ServerSocket;//監(jiān)聽 public Socket SocketAccept;//綁定客戶端 public Socket socket;//和客戶端通信 #region 開啟監(jiān)聽 Thread t1;//監(jiān)聽 Thread t2;//接收 //開啟監(jiān)聽(監(jiān)聽的是客戶端的鏈接) private void button1_Click(object sender, EventArgs e) { //實例化socket對象 //參1:綁定一個ip地址,參2:數據流的格式,參3:協(xié)議 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //準備ip對象綁定ip地址 IPAddress ip = IPAddress.Parse(textBox1.Text); //創(chuàng)建端口號 int port = Convert.ToInt32(textBox2.Text); //把輸入的ip和端口傳入到連接中,嘗試鏈接 IPEndPoint iPEndPoint = new IPEndPoint(ip, port); try { //開啟服務器的時候很容易報錯,所有做異常處理 ServerSocket.Bind(iPEndPoint); //開啟監(jiān)聽(參數是監(jiān)聽的數量) ServerSocket.Listen(5); //禁用按鈕,避免重復監(jiān)聽 button1.Enabled = false; //監(jiān)聽是持續(xù)的,所以要在分線程中進行 t1 = new Thread(Listen); //設置成后臺線程 t1.IsBackground = true; //分線程中開始對socket監(jiān)聽 t1.Start(ServerSocket); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Listen(object o) { SocketAccept = o as Socket; try { //因為要持續(xù)監(jiān)聽,所以用了while循環(huán) while (true) { //阻塞線程,直到有客戶端進來的時候才會往下執(zhí)行 socket = SocketAccept.Accept(); //表示有客戶端進來了,需要顯示到textBox上面 AddMsg(DateTime.Now.ToString("yyyy-mmddHHMMSS") + ":" + socket.RemoteEndPoint + "鏈接成功"); //換行操作 AddMsg("\r\n"); //開啟第二個線程,用來檢測客戶端傳遞過來的消息 t2 = new Thread(Receive); t2.IsBackground = true; t2.Start(socket); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //接收消息的方法 private void Receive(object obj) { socket = obj as Socket; try { while (true) { //定義字節(jié),接收數據 byte[] buffer = new byte[1024 * 1024 * 2]; int r = socket.Receive(buffer); if (r == 0) { break; } string msg = Encoding.Default.GetString(buffer); AddMsg("他說:" + msg); AddMsg("\r\n"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void AddMsg(string msg) { //異步處理,否則沒辦法刷新ui richText.BeginInvoke(new Action<string>(str => { richText.Text += msg; }), msg); } #endregion //發(fā)送消息 private void sendBtn_Click(object sender, EventArgs e) { //首先獲取要發(fā)送的消息 string str = sendText.Text; byte[] buffer = Encoding.Default.GetBytes(str); try { socket.Send(buffer); AddMsg("我說:" + str); AddMsg("\r\n"); sendText.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //關閉客戶端 private void button2_Click(object sender, EventArgs e) { if (socket != null) { //禁掉socket的接收和發(fā)送 socket.Shutdown(SocketShutdown.Both); socket.Close(); t2.Abort(); } ServerSocket.Close(); SocketAccept.Close(); t1.Abort(); //打開監(jiān)聽的按鈕 button1.Enabled = true; } } }
TCP客戶端代碼展示
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace _5_TCP客戶端 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //描述套字節(jié)對象 public Socket clientSoket; public Socket socket;//和客戶端通信 //創(chuàng)建一個線程。 Thread t1;//接收消息 //服務器鏈接 private void conecBtn_Click(object sender, EventArgs e) { //初始化socket對象 clientSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //綁定IP IPAddress ip = IPAddress.Parse(ipTxt.Text); int port = Convert.ToInt32(portTxt.Text); //形成連接點 IPEndPoint iPEndPoint = new IPEndPoint(ip, port); //嘗試與遠程主機鏈接 try { clientSoket.Connect(iPEndPoint); AddMsg(DateTime.Now.ToString("HHmmss:") + "鏈接服務器"); AddMsg("\r\n"); conecBtn.Enabled = false; //開啟監(jiān)聽 t1 = new Thread(Receive); t1.IsBackground = true; t1.Start(clientSoket); } catch (Exception ex) { MessageBox.Show("錯誤消息:" + ex.Message); } } //封裝一個顯示數據的方法 private void AddMsg(string msg) { textBox4.BeginInvoke(new Action<string>(str => { textBox4.Text += str; }), msg); } //封裝一個接收消息的方法 private void Receive(object o) { //當前聊天的對象 Socket clientSocket = o as Socket; while (true) { try { //把字節(jié)轉成string byte[] buffer = new byte[1024 * 1024 * 2]; int r = clientSocket.Receive(buffer); if (r == 0) { break; } string msg = Encoding.Default.GetString(buffer); AddMsg("接收到的消息:" + msg); AddMsg("\r\n"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } //發(fā)送消息 private void sendMsg_Click(object sender, EventArgs e) { byte[] buffer = new byte[1024 * 1024 * 2]; string str = textBox3.Text; //轉碼 buffer = Encoding.Default.GetBytes(str); //發(fā) try { clientSoket.Send(buffer); AddMsg(str); AddMsg("\r\n"); textBox3.Clear(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //斷開連接 private void button2_Click(object sender, EventArgs e) { if (clientSoket != null) { //禁掉socket的接收和發(fā)送 clientSoket.Shutdown(SocketShutdown.Both); clientSoket.Close(); t1.Abort(); } t1.Abort(); //打開監(jiān)聽的按鈕 conecBtn.Enabled = true; } } }
以上就是C#聯(lián)合VisionPro實現TCP/IP通信詳解的詳細內容,更多關于C# TCP/IP通信的資料請關注腳本之家其它相關文章!