C#上位机:TCP通讯实例

这篇具有很好参考价值的文章主要介绍了C#上位机:TCP通讯实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文主要是提供一个TCP通讯的Demo。有时候上位机需要通过TCP来进行文件与数据传输,相对于基础的IO与串口,TCP的传输内容可能更加复杂,本文尽量从多个角度来给出示例。
关于上位机的搭建与通讯我们已经有以下几个部分可供参考:
C#上位机:串口通讯
C#上位机:Modbus RTU通讯实例
C#上位机:Modbus TCP通讯实例
概念提要:
TCP通讯:一种字节流传输层通讯协议,流程为建立连接-传输数据-释放连接。
实现方式:Socket编程
监听IP:监听一个IP地址,当有数据传输时,进行接收,当无数据时保持对IP地址的监听状态。
模拟通讯:软件名:Hercules,提供TCP Clien与Server的测试端口。
c# tcp client上位机,tcp/ip,c#,网络,自动化

数据传输

首先添加Socket

using System.Net;
using System.Net.Sockets;
using System.Threading;

然后在代码层添加监听

public partial class Form1 : Form
    {
        TcpListener listener;
        public Form1()
        {
            InitializeComponent();
        }
     }

c# tcp client上位机,tcp/ip,c#,网络,自动化

然后我们以Client的形式向主站建立连接并发送数据。

/// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void send_Click(object sender, EventArgs e)
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPort.Text));//建立连接
                NetworkStream ns = client.GetStream();
                int size = 9;
                byte[] buffer = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                ns.Write(buffer, 0, size);           
                ns.Flush();
                ns.Close();
            }
            catch
            {
            }
        }

然后我们监听一个IP地址,等待Client向该IP发送数据

 /// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lisBegin_Click(object sender, EventArgs e)
        {
            try
            {
                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), int.Parse("501"));
                listener.Start();
                //MessageBox.Show("开始监听");
                Thread th = new Thread(ReceiveMsg);//启用监听线程
                th.Start();
                th.IsBackground = true;
                button1.Text = "正在监听";//锁掉按键并显示状态
                button1.Enabled = false;
            }
            catch
            {
                MessageBox.Show("IP地址错误,监听失败");
            }
        }
         /// <summary>
        /// 监听线程
        /// </summary>
        public void ReceiveMsg()
        {
            while (true)
            {
                try
                {
                    int size = 0;
                    int len = 0;
                    TcpClient client = listener.AcceptTcpClient();

                    if (client.Connected)
                    {
                        MessageBox.Show("连接成功");
                    }
                    NetworkStream stream = client.GetStream();
                    if (stream != null)
                    {
                        byte[] buffer = new byte[512];
                        while ((size = stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                           
                            string s = Convert.ToString(buffer[0]);//输出第一位来检查连接
                            MessageBox.Show(s);
                            len += size;
                        }
                                 
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("异常:" + ex.Message);
                }
            }
        }

我们启动监听,并打开Hercules,用Client启动连接,并随意发送一段数据:
c# tcp client上位机,tcp/ip,c#,网络,自动化
数据传输测试完成。
另:我们对一个端口监听的状态,不随Client的连接状态而发生改变,在实际上的生产中,我们的脚本或者是上位机可以保持长时间不间断的监听一个本地ip,并可以用Switch等硬件来实现一种类似数据采集卡的效果。

文件传输

我们以传输图片为例子,在这一步的操作中,我们在发送端要将一个文件整合成字节流发送,接收后我们再将字节流整合成文件。
首先提取文件:

FileStream fs = new FileStream(txtFileName.Text, FileMode.Open);

在发送过程中将文件流整合为字节流:

size = fs.Read(buffer, 0, buffer.Length);
ns.Write(buffer, 0, size);

这便完成了文件的发送。文件的接收则是,将字节流按照格式整合成一个文件:

string path1 = saveadress.Text;
string path = path1 +Id + ".JPG";
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);

在接收时:

byte[] buffer = new byte[512];
while ((size = stream.Read(buffer, 0, buffer.Length)) > 0)
{
         fs.Write(buffer, 0, size);
         len += size;
}

Demo设计与完整代码

我们设计一个发送与接收同端的Demo来进行测试代码的可行性,也就是自发自接。大概可如下:
c# tcp client上位机,tcp/ip,c#,网络,自动化

/// <summary>
        /// 发送文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sendPhoto_Click(object sender, EventArgs e)
        {
            string s;
            TcpClient client = new TcpClient();
            
            try
            {
                string Path= Path.Text;
                FileStream fs = new FileStream(Path, FileMode.Open);
                    try
                    {
                        client.Connect(IPAddress.Parse("127.0.0.1"), int.Parse("501"));//请自行向前端要ip
                        NetworkStream ns = client.GetStream();
                        int size = 0;//初始化读取的流量为0   
                        long len = 0;//初始化已经读取的流量   
                        while (len < fs.Length)
                        {
                            byte[] buffer = new byte[512];
                            size = fs.Read(buffer, 0, buffer.Length);
                            ns.Write(buffer, 0, size);
                            len += size;
                        }
                        fs.Flush();
                        ns.Flush();
                        fs.Close();
                        ns.Close();
                        MessageBox.Show( "文件发送成功");
                    }
                    catch
                    {
                        fs.Flush();
                        //ns.Flush();
                        fs.Close();
                    MessageBox.Show("文件发送失败");
                    Thread.Sleep(800);
                    }     
            }
            catch
            {        
                    MessageBox.Show("文件地址不正确!");
            }  
        }
/// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lisBegin_Click(object sender, EventArgs e)
        {
            try
            {
                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), int.Parse("501"));
                listener.Start();
                //MessageBox.Show("开始监听");
                Thread th = new Thread(ReceiveMsg);
                th.Start();
                th.IsBackground = true;
                button1.Text = "正在监听";
                button1.Enabled = false;
            }
            catch
            {
                MessageBox.Show("IP地址错误,监听失败");
            }
        }
/// <summary>
/// 监听线程
/// </summary>
public void ReceiveMsg()
        {
           
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                NetworkStream stream = client.GetStream();
                if (client.Connected)
                {
                    MessageBox.Show("连接成功");
                }
                try
                {
                    int s = 1;
                    int size;
                    int len=0;
                    string yy = DateTime.Now.Year.ToString();   // 2023
                    string mm = DateTime.Now.Month.ToString();    // 6

                    string path1 = saveAdress.Text;
                    string path = path1 + "\\" + yy + "\\" + mm + "\\"  +"test "+".JPG";
                    string filename = path1 + "\\" + yy + "\\" + mm;
                    if (!Directory.Exists(filename))
                    {
                        Directory.CreateDirectory(filename);
                    }
                    while (File.Exists(path))//针对重复照片
                    {

                        path = path1 + "\\" + yy + "\\" + mm + "\\"  + "(" + Convert.ToString(s) + ")" + ".JPG";
                        s++;
                    }
                    FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);

                    byte[] buffer = new byte[512];
                    while ((size = stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        fs.Write(buffer, 0, size);
                        len += size;
                    }
                    fs.Flush();
                    stream.Flush();
                    stream.Close();
                    client.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("异常:" + ex.Message);
                }
            }
        }

c# tcp client上位机,tcp/ip,c#,网络,自动化
c# tcp client上位机,tcp/ip,c#,网络,自动化

测试成功。文章来源地址https://www.toymoban.com/news/detail-793178.html

到了这里,关于C#上位机:TCP通讯实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 西门子PLC S7-1200程序实例,西门子1200与安川机器人TCP IP通讯

    西门子PLC S7-1200程序实例,博图版本V15 1,西门子1200与安川机器人TCP IP通讯,包含机器人GSD文件; 2,西门子1200控制6轴伺服电机,四台台脉冲控制台达B2伺服,两台PN通讯控制西门子V90伺服电机; 3,两台西门子1200开放式通讯交互数据联动; 4,与4台位移传感器modbus485轮询读取

    2024年04月10日
    浏览(54)
  • Java与Modbus-TCP/IP网络通讯

    通过Java与Modbus-TCP/IP网络通讯实现举例5中的功能

    2024年02月10日
    浏览(46)
  • C#向指定的ip地址通过TCP/IP协议发送和接受信息

    需要使用Socket类来创建和连接TCP/IP套接字,并使用Send和Receive方法来发送和接收数据。还需要引用System.Net和System.Net.Sockets命名空间。 以下是一个示例代码,它发送一个字符串消息到指定的IP地址和端口,并接收返回消息。 了解更多C#可以访问C#的官方教程 本文也参考了C#的官

    2024年02月07日
    浏览(44)
  • C#网络TCP服务器端的实现

    1、实现代码 2、运行效果

    2024年02月11日
    浏览(44)
  • C# 机器视觉工控通讯------发那科机器人上位机通讯

    C#  采用发那科Robot Interface 中间库和机器人控制柜通过网络通讯,主要功能如下: 3 读取发那科机器人DO值 4 写发那科机器人DO值

    2024年02月12日
    浏览(94)
  • 上位机与欧姆龙PLC的Fins tcp通讯

    参考1:(147条消息) 欧姆龙PLC的FinsTCP协议_weixin_37700863的博客-CSDN博客_欧姆龙fins协议tcp   参考2:(147条消息) FinsTCP协议报文详细分析_常哥说编程的博客-CSDN博客_fins协议 参考3:(147条消息) 欧姆龙FINS通讯命令实例详解_搬砖dog的博客-CSDN博客_欧姆龙fins 上述文档中有部分描述错误

    2024年02月11日
    浏览(51)
  • 西门子PLC S7-1200程序实例 西门子1200与安川机器人TCP/IP通讯,包含机器人GSD文件

    西门子PLC S7-1200程序实例,博图版本V15,仅供电气编程者学习借鉴, 1,西门子1200与安川机器人TCP/IP通讯,包含机器人GSD文件; 2,西门子1200控制6轴伺服电机,四台台脉冲控制台达B2伺服,两台PN通讯控制西门子V90伺服电机; 3,两台西门子1200开放式通讯交互数据联动; 4,与

    2024年02月11日
    浏览(56)
  • C#实现简单TCP服务器和客户端网络编程

    在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间: System.Net 命名空间: 这个命名空间提供了大部分网络编程所需的类,包括: IPAddress :用于表示IP地址。 IPEndPoint :表示IP地址和端口号的组合。 Socke

    2024年02月11日
    浏览(60)
  • websocket实现go(server)与c#(client)通讯

    使用到github.com/gorilla/websocket C#操作websocket当客户端使用时使用 System.Net.Websockets 这个命名空间下的 ClientWebSocket 类 winform的设计界面如下: 代码如下: 注意:无论是客户端断开还是服务端断开,如果正在读取消息,则会触发错误。利用此机制可以很方便的处理重连问题。

    2024年02月06日
    浏览(32)
  • 【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程

    我这里新建了一个C#控制台项目来写服务端代码。 下面是基于C# Socket的最基础服务端通信流程: 创建服务端Socket对象 绑定IP地址和端口 设置最大监听客户端数量 等待客户端连接 收发消息 释放连接 基于上面流程就能实现一个最简单并且能和客户端通信的服务器程序,每个步

    2023年04月16日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包