从学习Intouch上位机组态到爱上C#难度有多大? 开发简易聊天室

[复制链接]
查看26253 | 回复0 | 2024-12-24 14:37:59 | 显示全部楼层 |阅读模式
                                                

写在前面:
Intouch作为国际一流的上位机组态软件,正越来越受到国内客户和厂商的喜爱,在自动化板块的各大招聘信息上都把掌握Intouch软件当作一个合格自控工程师的的必备条件。而作为上位机的开发工具,C#更有其广泛的用途,不仅能够开发出优秀的上位机组态监控软件,还可以制作互联网通信小工具。所以同时掌握C#去哪儿也不怕,在学习的过程中可以根据自己的想法和爱好开发一些有趣的软件来激发更多的学习热情,引导兴趣。能够使用几款上位机组态软件并不够,还需要自己学会去开发。以什么样的学习打开方式很重要,最有意思的是以目的为导向来开发身边的一些常见的功能。

前面推荐,感兴趣的可以点击查看:戳↓
1.Intouch【历史报警/事件】导出Excel史上最强插件快拿去用吧2.Intouch动画制作学习(附案例免费下载)



图例







Part01-TCP传输控制协议

Transmission Control Protocol 传输控制协议TCP是面向连接的流模式(俗称:网络流)。即传输数据之前源端和终端建立可靠的连接,保证数据传输的正确性。 流模式:由于建立连接,收到的数据都是同一主机发送的,所有可以发送端Write一次,接收端Read多次;也可以发送端Write多次,接收端Read多次。但每次传输数据最大为1460字节。





Part02-实现步骤

服务端

获取本机终结点

创建TcpListener对象,开启侦听器

等待客户端连接

获取针对客户端连接的网络流客户端通信

……

关闭连接

客户端

获取服务器终结点

创建TcpClient对象

连接服务器

通过网络流与服务器通信

……

关闭连接





Part03-实操代码



    ChatTCPClientTest端:
using System.Collections;using System.Collections.Generic;using System.Net.Sockets;using UnityEngine;using Common;using UnityEngine.UI;using System.Net;using System;using System.Text;/// TCP 客户端  发送消息///public class ChatTCPClientTest : MonoBehaviour{    private InputField messageInput;    private TcpClient tcpClient;    private void Start()    {        var server = FindObjectOfType();        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(server.serverIP), server.serverPort);        //创建终结点        tcpClient = new TcpClient();        //1. 创建Socket        tcpClient.Connect(ep);  ////三次握手(连接请求)        //使用指定的远程网络终结点将客户端连接到TCP主机        messageInput = transform.FindChildByName("MessageInput").GetComponent();        transform.FindChildByName("Send").GetComponent().onClick.AddListener(OnSendButtonClient);    }
    private void OnSendButtonClient()    {        SendChatMessage(messageInput.text);    }    private void SendChatMessage(string msg)    {        //获取网络流        NetworkStream stream = tcpClient.GetStream();        //用于发送消息和接收消息        byte[] dgramContent = Encoding.UTF8.GetBytes(msg);        //传入内容        stream.Write(dgramContent, 0, dgramContent.Length);        //写入网络流  内容  从那开始发  发的长度    }
    /// 3.关闭连接/释放资源    ///     private void OnApplicationQuit()    {        tcpClient.Close();    }}



    ChatTCPServerTest端:
using System.Collections;using System.Collections.Generic;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using UIWidgetsSamples;using UnityEngine;using Common;using System;
/// 服务端  TCP 接收消息///public class ChatTCPServerTest : MonoBehaviour{    public string serverIP;    //IP    public int serverPort;    //端口    //1.创建Socket对象    private ChatView chatView;    private void Start()    {        chatView = transform.FindChildByName("ChatView").GetComponent();        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);        //1). 创建对象并开启监听        serverlisten = new TcpListener(ep);//需要一个终结点        serverlisten.Start();        //2.线程        thread = new Thread(ReceiveClient);        thread.Start();    }    private TcpListener serverlisten;    private Thread thread;    //2.开启监听    //3.接收数据 显示    private void ReceiveClient()    {        TcpClient client = serverlisten.AcceptTcpClient();        //接收消息                      //AcceptTcpClient() 接受挂起连接请求        NetworkStream stream = client.GetStream();        //读取网络流到容器        byte[] date = new byte[1024];        //返回读了多少字节        //Read读取消息 如果没有读取到  线程阻塞        //如果有多个客户端 要循环接收  将读到的信息放到线程中        int count;        while((count=stream.Read(date,0,date.Length))>0) //count为0  表示客户端下线        {            //解析            string msg = Encoding.UTF8.GetString(date);            ThreadCrossHelper.Instance.ExecuteOnMainThread(() => { ShowMessage(msg); });        }        client.Close();//关闭Socket对象 自动释放流    }

    private void ShowMessage(string msg)    {        chatView.DataSource.Add(new ChatLine()        {            UserName = "AnnS",            Message = msg,            Time = DateTime.Now,            Type = ChatLineType.User,        });    }    //4.关闭    public void OnApplicationQuit()    {        thread.Abort();        serverlisten.Stop();    }}





Part04-交互过程

中间发生连接请求过程(三次握手) , 断开连接(四次挥手)

三次握手

所谓三次握手就是建立TCP连接的过程,需要客户端和服务端总共发送3个包确认连接成功。在socket编程中,这一过程由客户端执行connect来触发。简而言之:第一次,客户端向服务端发出连接请求数据包。 “我想跟你聊会,可以吗?”第二次,服务端向客户端发送同意连接和要求同步的数据包。“可以,什么时候啊?”第三次,客户端再发出一个数据包确认服务器的同步要求。“就现在。”
四次挥手

所谓四次挥手就是终止TCP连接的过程,需要客户端和服务端总共发送4个包以确认连接断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发简而言之:第一次,客户端向服务端发送断开请求数据包。 “我都说完了,今天就到这吧”第二次,服务端向客户端发送同意断开数据包。“恩,好的。”第三次,服务端再向客户端发送断开请求数据报。“那我挂了啊?”第四次,客户端再向服务端发送确认断开数据报。“拜拜”此时服务端断开连接,客户端过会发现服务端没有回复,也断开连接。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则