最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#聯(lián)合VisionPro實現(xiàn)TCP/IP通信詳解

 更新時間:2024年02月27日 08:51:56   作者:郭貝貝同學(xué)  
TCP/IP(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是一組用于在網(wǎng)絡(luò)上進(jìn)行通信的通信協(xié)議,本文主要為大家詳細(xì)介紹了C#如何聯(lián)合VisionPro實現(xiàn)TCP/IP通信,希望對大家有所幫助

TCP/IP(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是一組用于在網(wǎng)絡(luò)上進(jìn)行通信的通信協(xié)議。它是互聯(lián)網(wǎng)和許多局域網(wǎng)的基礎(chǔ),為計算機之間的數(shù)據(jù)傳輸提供了可靠性、有序性和錯誤檢測。在軟件開發(fā)中,TCP/IP 通信通常用于實現(xiàn)網(wǎng)絡(luò)應(yīng)用程序之間的數(shù)據(jù)交換。

基于 TCP/IP 的通信通常涉及以下幾個步驟:

1、建立連接: 通信雙方通過套接字(socket)建立連接。在 C# 中,你可以使用 TcpClient 類來創(chuàng)建一個 TCP 客戶端,并使用 TcpListener 類來創(chuàng)建一個 TCP 服務(wù)器端。

2、發(fā)送和接收數(shù)據(jù): 一旦連接建立,通信雙方可以通過套接字發(fā)送和接收數(shù)據(jù)。在 C# 中,你可以使用 NetworkStream 類來發(fā)送和接收數(shù)據(jù)。

3、關(guān)閉連接: 在通信完成后,通信雙方可以通過關(guān)閉套接字來斷開連接,釋放資源。

代碼展示

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:數(shù)據(jù)流的格式,參3:協(xié)議
      ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //準(zhǔn)備ip對象綁定ip地址
      IPAddress ip = IPAddress.Parse(textBox1.Text);
      //創(chuàng)建端口號
      int port = Convert.ToInt32(textBox2.Text);
      //把輸入的ip和端口傳入到連接中,嘗試鏈接
      IPEndPoint iPEndPoint = new IPEndPoint(ip, port);
      try {
        //開啟服務(wù)器的時候很容易報錯,所有做異常處理
        ServerSocket.Bind(iPEndPoint);
        //開啟監(jiān)聽(參數(shù)是監(jiān)聽的數(shù)量)
        ServerSocket.Listen(5);
        //禁用按鈕,避免重復(fù)監(jiān)聽
        button1.Enabled = false;
        //監(jiān)聽是持續(xù)的,所以要在分線程中進(jìn)行
        t1 = new Thread(Listen);
        //設(shè)置成后臺線程
        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) {
          //阻塞線程,直到有客戶端進(jìn)來的時候才會往下執(zhí)行
          socket = SocketAccept.Accept();
          //表示有客戶端進(jìn)來了,需要顯示到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é),接收數(shù)據(jù)
          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);
      }
    }

    //關(guān)閉客戶端
    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;//接收消息

    //服務(wù)器鏈接
    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);
      //嘗試與遠(yuǎn)程主機鏈接
      try {
        clientSoket.Connect(iPEndPoint);
        AddMsg(DateTime.Now.ToString("HHmmss:") + "鏈接服務(wù)器");
        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);
      }
    }

    //封裝一個顯示數(shù)據(jù)的方法
    private void AddMsg(string msg) {
      textBox4.BeginInvoke(new Action<string>(str => {
        textBox4.Text += str;
      }), msg);
    }

    //封裝一個接收消息的方法
    private void Receive(object o) {
      //當(dāng)前聊天的對象
      Socket clientSocket = o as Socket;
      while (true) {
        try {
          //把字節(jié)轉(zhuǎn)成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;
      //轉(zhuǎn)碼
      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實現(xiàn)TCP/IP通信詳解的詳細(xì)內(nèi)容,更多關(guān)于C# TCP/IP通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

磐安县| 尖扎县| 鹿泉市| 抚顺市| 陆河县| 新乐市| 稷山县| 嘉善县| 尤溪县| 玉门市| 进贤县| 丰都县| 离岛区| 南昌县| 东辽县| 阳城县| 天镇县| 兴和县| 南投市| 三江| 曲阳县| 峡江县| 弋阳县| 杭州市| 叶城县| 平江县| 古田县| 巴里| 宁远县| 丰镇市| 荔波县| 大安市| 江孜县| 临泉县| 上林县| 岢岚县| 靖西县| 海原县| 新绛县| 昆山市| 内江市|