C#联合VisionPro实现TCP/IP通信详解

 更新时间:2024年02月27日 08:51:56   作者:郭贝贝同学  
TCP/IP(传输控制协议/互联网协议)是一组用于在网络上进行通信的通信协议,本文主要为大家详细介绍了C#如何联合VisionPro实现TCP/IP通信,希望对大家有所帮助

TCP/IP(传输控制协议/互联网协议)是一组用于在网络上进行通信的通信协议。它是互联网和许多局域网的基础,为计算机之间的数据传输提供了可靠性、有序性和错误检测。在软件开发中,TCP/IP 通信通常用于实现网络应用程序之间的数据交换。

基于 TCP/IP 的通信通常涉及以下几个步骤:

1、建立连接: 通信双方通过套接字(socket)建立连接。在 C# 中,你可以使用 TcpClient 类来创建一个 TCP 客户端,并使用 TcpListener 类来创建一个 TCP 服务器端。

2、发送和接收数据: 一旦连接建立,通信双方可以通过套接字发送和接收数据。在 C# 中,你可以使用 NetworkStream 类来发送和接收数据。

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;//监听
    public Socket SocketAccept;//绑定客户端
    public Socket socket;//和客户端通信

    #region 开启监听
    Thread t1;//监听
    Thread t2;//接收

    //开启监听(监听的是客户端的链接)
    private void button1_Click(object sender, EventArgs e) {
      //实例化socket对象
      //参1:绑定一个ip地址,参2:数据流的格式,参3:协议
      ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      //准备ip对象绑定ip地址
      IPAddress ip = IPAddress.Parse(textBox1.Text);
      //创建端口号
      int port = Convert.ToInt32(textBox2.Text);
      //把输入的ip和端口传入到连接中,尝试链接
      IPEndPoint iPEndPoint = new IPEndPoint(ip, port);
      try {
        //开启服务器的时候很容易报错,所有做异常处理
        ServerSocket.Bind(iPEndPoint);
        //开启监听(参数是监听的数量)
        ServerSocket.Listen(5);
        //禁用按钮,避免重复监听
        button1.Enabled = false;
        //监听是持续的,所以要在分线程中进行
        t1 = new Thread(Listen);
        //设置成后台线程
        t1.IsBackground = true;
        //分线程中开始对socket监听
        t1.Start(ServerSocket);
      } catch (Exception ex) {
        MessageBox.Show(ex.Message);
      }
    }

    private void Listen(object o) {
      SocketAccept = o as Socket;
      try {
        //因为要持续监听,所以用了while循环
        while (true) {
          //阻塞线程,直到有客户端进来的时候才会往下执行
          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) {
          //定义字节,接收数据
          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

    //发送消息
    private void sendBtn_Click(object sender, EventArgs e) {
      //首先获取要发送的消息
      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的接收和发送
        socket.Shutdown(SocketShutdown.Both);
        socket.Close();
        t2.Abort();
      }
      ServerSocket.Close();
      SocketAccept.Close();
      t1.Abort();
      //打开监听的按钮
      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();
    }

    //描述套字节对象
    public Socket clientSoket;
    public Socket socket;//和客户端通信
    //创建一个线程。
    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;

        //开启监听
        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 {
          //把字节转成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);
        }
      }
    }

    //发送消息
    private void sendMsg_Click(object sender, EventArgs e) {
      byte[] buffer = new byte[1024 * 1024 * 2];
      string str = textBox3.Text;
      //转码
      buffer = Encoding.Default.GetBytes(str);
      //发
      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的接收和发送
        clientSoket.Shutdown(SocketShutdown.Both);
        clientSoket.Close();
        t1.Abort();
      }
      t1.Abort();
      //打开监听的按钮
      conecBtn.Enabled = true;
    }
  }
}

以上就是C#联合VisionPro实现TCP/IP通信详解的详细内容,更多关于C# TCP/IP通信的资料请关注脚本之家其它相关文章!

相关文章

  • c#中判断类是否继承于泛型基类

    c#中判断类是否继承于泛型基类

    这篇文章主要介绍了c#中判断类是否继承于泛型基类,最简单的办法肯定是typeof(b).baseType=typeof(a<string>)这样就可以返回true,但是这种方法时不妥的,下面看看如何解决这个问题呢
    2022-04-04
  • C#实现调用本机摄像头实例

    C#实现调用本机摄像头实例

    这篇文章主要介绍了C#实现调用本机摄像头的方法,可以实现调用本机摄像头进行拍照,具有不错的实用价值,需要的朋友可以参考下
    2014-08-08
  • Unity实现主角移动与摄像机跟随

    Unity实现主角移动与摄像机跟随

    这篇文章主要为大家详细介绍了Unity实现主角移动与摄像机跟随,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 解析C#中的常量及如何在C#编程中定义常量

    解析C#中的常量及如何在C#编程中定义常量

    这篇文章主要介绍了C#中的常量及如何在C#编程中定义常量,是C#入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 详解C#如何判断字符串的显示宽度

    详解C#如何判断字符串的显示宽度

    这篇文章主要为大家详细介绍了C#判断字符串的显示宽度的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-11-11
  • C#中使用HttpDownLoadHelper下载文件实例

    C#中使用HttpDownLoadHelper下载文件实例

    这篇文章主要介绍了C#中使用HttpDownLoadHelper下载文件的方法,并实例讲述了在webfrom中与在mvc中的实现方法,需要的朋友可以参考下
    2014-10-10
  • C#使用LINQ查询文件列表并找出最大文件

    C#使用LINQ查询文件列表并找出最大文件

    在现代 C# 开发中,LINQ (Language Integrated Query) 提供了一种强大而优雅的方式来处理集合数据,本文将详细介绍如何使用 LINQ 查询文件系统中的文件,并找出最大的文件数量,需要的朋友可以参考下
    2024-10-10
  • C# networkcomms 3.0实现模拟登陆总结

    C# networkcomms 3.0实现模拟登陆总结

    这篇文章主要介绍了C# networkcomms 3.0实现模拟登陆总结,需要的朋友可以参考下
    2017-06-06
  • 关于C#中的Invoke示例详解

    关于C#中的Invoke示例详解

    一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解,下面这篇文章主要给大家介绍了关于C#中Invoke的相关资料,需要的朋友可以参考下
    2023-02-02
  • C#实现同Active MQ通讯的方法

    C#实现同Active MQ通讯的方法

    这篇文章主要介绍了C#实现同Active MQ通讯的方法,简单分析了Active MQ的功能及C#与之通讯的实现技巧,需要的朋友可以参考下
    2016-07-07

最新评论