​1 程序界面设计

TCP客户端在上位机开发中应用很广,大多数情况下,上位机软件都是作为一个TCP客户端来与PLC或其他服务器进行通信的。TCP客户端的主要功能就是连接服务器、发送数据、接收数据、断开连接,而不同场合的区别在于发送数据和接收数据的内容不同。

本案例主要是开发一个TCP客户端软件,具备基本的连接功能,并可以发送ASCII、UTF8等不同格式的字符串,也支持发送16进制字符串发送,同时支持文件和JSON格式数据发送。根据以上功能,设计程序界面如下图所示:

2 程序代码设计

  • 接收信息显示:首先编写一个接收信息显示的方法,这里是通过ListView来展示接收信息的。

  • 连接服务器:连接服务器首先实例化Socket对象,然后通过调用Connect的方法来实现,连接成功后,开启一个线程来接收服务器返回的数据,具体代码如下:

  • 断开连接服务器:断开连接服务器直接调用Socket的相关API方法即可。

  • 接收数据:对于数据接收及解析,由于本案例的客户端软件支持多种不同形式数据发送,那么接收必然也支持多种形式,那么对于不同的形式,我们创建了一个枚举类型,这样方便后续扩展,代码如下所示:

  • 因此在数据接收处理时,我们用第一个字节作为类型判断,比如第一个字节如果为0,那么则认为接收的数据为ASCII字符串,也将按照这种形式来进行解析,从第二个字节开始一直到最后,是有效数据部分,所以数据接收及解析方法如下所示:

  • 发送ASCII字符串:对于ASCII字符串,首先要将发送的字符串按照ASCII的编码格式转换成字节数组,然后给这个字节数组前面增加一个字节,字节数值为Message.ASCII,代码如下所示:

  • 发送文件:发送文件之前首先要选择文件,选择文件主要使用OpenFileDialog组件,代码如下:

  • 选择文件之后,发送文件就是将选择的文件内容转换成字节数组,然后给这个字节数组前面增加一个字节,字节数值为Message.File,这里会发送两次,第一次是发送一个字符串,告诉服务器要发送的文件名称,采用的是UTF8编码,代码如下所示:

  • 发送JSON数据:JSON数据主要会涉及到实体对象和JSON文件的转换,这里使用Newtonsoft.Json库编写了一个JSONHelper的方法,然后需要创建了一个实体对象集合,然后通过EntityToJSON方法转换成JSON字符串,再将JSON字符串转换成字节数组,同样,前面需要增加一个字节,字节数值为Message.JSON,代码如下:

3 程序功能调试

由于TCP服务器软件还没有开发,所以这里我们使用网络调试助手来进行功能调试:

  • 建立连接与断开连接:

  • 各种数据类型发送与接收

回顾往期内容

【西门子】基于PLCSIM-Advanced搭建西门子PLC环境

【西门子】西门子S7通信协议,你不知道的那些事儿

【OPCUA】C#上位机实现OPCUA通信案例

【OPCUA】OPCUA+MQTT+阿里云,能做哪些事儿

【WinCC】C#/.NET联合WinCC实现数据通信

【WinCC】手把手教你基于C#开发Wincc语音报警插件【附源码】

【云APP】基于C#实现手机APP访问西门子PLC【附源码】

「完整案例」基于Socket开发TCP传输客户端的更多相关文章

  1. 基于socket的TCP和UDP编程

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  2. (转)基于socket的TCP和UDP编程

    一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...

  3. 网络编程 基础 基于socket的tcp和udp连接

    网络开发的框架 C/S B/S 架构 程序都是bs架构的程序(b指浏览器,s指服务器) c(client)是客户端,s(server)是服务器 bs架构是cs架构的一种 未来的趋势, pc端bs架构, ...

  4. 基于socket、多线程的客户端服务器端聊天程序

    服务器端: using System; using System.Windows.Forms; using System.Net.Sockets; using System.Net;//IPAddre ...

  5. 基于socket开发网络调试助手

    1.什么是Socket? 在计算机领域socket被翻译为套接字,它是计算机之间进行通信的一种方式,通过socket这种约定,一台计算机可以向另外一台计算机发送数据和接收数据. 2.Socket的本质 ...

  6. 「1.0」一个人开发一个App,小程序从0到1,起航了

    古有,秦.齐.楚.赵.魏.韩.燕七国争雄:今有,微信.QQ.百度.支付宝.钉钉.头条.抖音七台争霸.古有,白起.李牧.王翦.孙膑.庞涓.赵奢.廉颇驰骋疆场:今有程序员1,程序员2,程序员3…编写代码. ...

  7. 「2.0」一个人开发一个App,小程序从0到1,文件剖析

    不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...

  8. 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之自定义组件(四)

    基于Vue和Quasar的前端SPA项目实战之序列号(四) 回顾 通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之布局菜单(三)的介绍,我们已经完成了布局菜单,本文主要介绍序列号功能的实 ...

  9. 「4.0」一个人开发一个App,小程序从0到1,布局

    一提到布局这个词,我总是索索发抖,不是因为天冷,而是因为布局的目标实在太宏大.古代想雄霸天下的王,就喜欢布局这个,布局那个,结果硬生生把自己的国家给布局没了.至于是哪个君王,我倒可以非常认真,非常坦诚 ...

随机推荐

  1. 清晰架构(Clean Architecture)的Go微服务—重大升级

    去年,我创建了一个清晰架构(Clean Architecture)微服务框架,它功能强大,但有些重.我写了一个系列文章来讲述它,请参阅"清晰架构(Clean Architecture)的Go ...

  2. RACTF-web C0llide?(js弱类型)

    源码: const bodyParser = require("body-parser") const express = require("express") ...

  3. Vue脚手架创建项目出现 (Failed to download repo vuejs-templates/webpack: Response code 404)

    搭建好(脚手架2.X版本)环境像往常一样使用vue init webpack xxxx 创建项目可以是没多久就开始报错了 报错结果就是:vue-cli · Failed to download rep ...

  4. 今天完成顺利编译d:\test\Console.java

    今天完成顺利编译d:\test\Console.java import javax.swing.*;import java.awt.event.*; public class Console{ pub ...

  5. Java瞬态变量transient

      我们都知道,阳光是看得见却摸不着的.它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量.这注定我们只能利用光子而不能将其捕获(或许只是暂时).在Java中,有一种变量就像光子一样, ...

  6. 数据结构C语言实现----树

    树的基本知识点 树的定义 树的ADT(抽象数据类型) 树的储存结构 二叉树的定义 二叉树的储存结构 遍历二叉树 二叉树的建立 二叉树的ADT typedef struct BiTNode { Elem ...

  7. variable ans might not have been initialized 报错,以及初始化注意点

    他是说你没有初始化而已,一般只是个warning,如果是在不能跑,那就给他初始化一下. 注意,初始化可不是任意值哈! 就比如如果要算阶乘,你初始化就不能为0. 还有如果是比较大小这类,就不要把初始化统 ...

  8. PHP strncmp() 函数

    实例 比较两个字符串(区分大小写): <?php高佣联盟 www.cgewang.comecho strncmp("Hello world!","Hello ear ...

  9. 7.9 NOI模拟赛 数列 交互 高精 字符串

    这是交互题 也是一个防Ak的题目 4个\(subtask\) 需要写3个不尽相同的算法. 题目下发了交互程序 所以调试的时候比较方便 有效防止\(CE\). 题目还有迷糊选手的点 数字位数为a 范围是 ...

  10. luogu CF125E MST Company wqs二分 构造

    LINK:CF125E MST Company 难点在于构造 前面说到了求最小值 可以二分出斜率k然后进行\(Kruskal\) 然后可以得到最小值.\(mx\)为值域. 得到最小值之后还有一个构造问 ...