.Net客户端与服务端应该用什么通讯方式最好?

背景:现要用写一个多客户端软件,软件需要录入很多数据到数据库,也需要从数据库获取很多数据展示个用户,需要展示的数据可达到十万级,当然可以分页动态加载。目前是在局域网内使用。
思路:如果直接在客户端软件里直接CRUD,按客户量连接池是没问题的,但是一旦软件被反编译了,数据库就暴露了。所以想用(客户端--服务端--数据库)的模式,但是小白(纯自学)以前没做过这类软件。
请问:1.客户端与服务端应该用什么通讯方式最好?(请考虑大量表数据的背景,以前都直接用DataTable直接绑到DataGridView)
                    2.如果要适用外网,又应该用什么通讯方式?
                    3.服务端应该怎样验证身份和权限?
                    4.数据序列化是用JSON或者XML还是有其他方式?
                    5.能否给个Demo?网上的文章地址也可以。奶奶的,我自己一搜,全是Socket聊天程序。
                    6.服务端最好是用.NET的,当然如果有其他明显适合的也可以。

1.我的话,会使用webapi来做服务端,既然你是分页加载,实际显示的数据其实并不多,太多数据其实用户体验也不好
2.买个云服务器,webapi部署上去即可
3.token校验,内部可存储用户id,权限信息
4.我一般用json格式
5.webapi创建网上一大把

服务器 分2个方式。

如果主动请求就 http 协议建立服务器,服务器可以直连数据库部署在服务器,客户端懒加载分页。如果不考虑实时可以用 Redis 做同步

如果是推送,可以考虑 MQTT 或 websokect 均可以。

数据传输格式推荐 json ,喜欢xml 也可以。

至于授权可以按照楼上说的,简历一个自己的授权规则,然后每次把 token 带过去。

1.客户端与服务端应该用什么通讯方式最好?局域网用UDP通讯很快。看个人喜欢咯你要用WCF也可以。
2.如果要适用外网,又应该用什么通讯方式?内外网没区别,外网的话要有一个外网服务器。
3.服务端应该怎样验证身份和权限?认证的方式有好多种,电子证书(以前那些加密狗什么的),NTID,指纹,刷脸等等,数据可以加密,你可以去了解一下非对称加密怎么玩的,权限可以做的很复杂,可以独立成一个权限系统
4.数据序列化是用JSON或者XML还是有其他方式?序列化跟JSON和XML没什么关系,序列化完之后你可以用JSON或者XML的格式来传输,看你的通讯协议怎么做
5.能否给个Demo。你自己搜索,Socket聊天程序也可以是Demo.
6.服务端最好是用.NET的,当然如果有其他明显适合的也可以。这个你自己决定

客户端软件(如winForm,wpf等)直接链接数据库是不安全的,也不允许这么做
大数据量,C-S通讯,当然首先考虑tcp方式了,是http方式的3倍,注意IIS7支持tcp
可以用wcf,socket

简单方式,就用asp.net,弄个大点的服务器(说服用户买高配服务器),将耗时操作甩给服务器,这样浏览器端就感觉快了
无非就是优化原生态sql语句,切记不用EF,LINQ

用HTTP  做BS就行了。如果需求不满足的话,就在客户端用SSL+HTTP API  实现。

我们的业务场景和你很相似,需要同时接入显示10万级的车辆。因为车辆的数据都是实时刷新的。所以通讯过程使用的是 自定义二进制协议 + TCP(楼主 可以换成websocket) 注意数据包大小直接影响你的用户体验,建议尽量只传状态数据。当需要请求单个目标的全部数据时再使用HTTP方式从服务 Redis中拉取。拉取后注意这个车辆需要改变状态,向服务端发出请求说这个目标的数据是全量推送的。
如果楼主需要在界面进行显示的话建议是聚合显示 。因为在客户端绘制会占用大量的CPU I7 7700K也没办法完成同一秒绘制10万个点,的同时保证 流畅。 所有采用分区法,只对特定的区域进行绘制会起到很好的体验改善。 当然如果楼主对通讯没什么经验的话建议不要用二进制协议,可以用 protobuf 进行数据传输。
基础数据根据使用场景可以采用本地缓存+服务器分批请求的方式进行加载。

因为涉及的推送功能,所以webapi感觉是不太合适的,wcf和socket都研究了一下,wcf没啥好说的,想学的网上教程都能找到。 socket(或者websocket)有一点想问一下,客户端是应该所有功能共用一个socket还是应该一个模块一个socket?服务端应该怎样识 别客户端发过来的数据是做什么的?是在数据内容里加一个字段用来标识这一段数据的目的,然后服务端用case分支来判断?还是有其他更好的方法?

Web完全可以,推送用SignalR。
可以分页,说明传输的数据并不多。而且十万级别的数据也不是很多。
有特殊功能,比如打印之类的,可以自定义浏览器WebBrowser之类的包装一下,高级点用CEFSharp

首先建议抛弃WCF,很简单,因为.net后续版本将会是.net core为核心的,不再支持WCF。

然后建议使用gRpc/thrift等第三方通信框架,或使用netty这样的第三方整合框架,这个建议是为了未来其他客户端接入服务端有标准通讯框架会更快速和便捷。

如果你想要使用我给你的框架,那么 https://github.com/Coldairarrow/DotNettyRPC 这个RPC的DEMO很合适你使用。

这样的好处是他是接口分离的框架,你未来使用框架的时候可以先根据设计给开发接口,服务端和客户端可以并发开发,对接测试。

这样你给客户端的东西只要是接口就好了,你甚至可以给对方源代码。因为只有接口,实现是你自己注册上去的:


//接口
    public interface IHello
    {
        string SayHello(string msg);
    }

//实现
    public class Hello : IHello
    {
        public string SayHello(string msg)
        {
            return msg;
        }
    }

//服务端代码
using Coldairarrow.DotNettyRPC;
using Common;
using System;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            RPCServer rPCServer = new RPCServer(9999);
            rPCServer.RegisterService<IHello, Hello>();
            rPCServer.Start();

            Console.ReadLine();
        }
    }
}

//客户端调用
using Coldairarrow.DotNettyRPC;
using Common;
using System;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            IHello client = RPCClientFactory.GetClient<IHello>("127.0.0.1", 9999);
            var msg = client.SayHello("Hello");
            Console.WriteLine(msg);
            Console.ReadLine();
        }
    }
}
服务端用webservice就行了;
客户端用HttpWebRequest链接服务端;
两端用json传输数据,解析方便; 
Socket处理服务端实时通知;
用Token处理权限问题

客户端 为什么不能用网页展示那?    如果选择客户端是IE展示     asp.net   webform    就搞定了。  但是按钮有刷新东西

如果不想有刷新动作  就  html+ajax + 服务端    

然后在说推送。  asp.net  封装了2个推送  一个webSocket  一个SignalR    还可以  自己写 段轮询 或者长轮询 。 看服务器 和使用人数来定义

你需要的东西就完成了

如果客户端非得用 winform 那就是  winform+webservice    推送方式  一软是那4个  

奉劝你, 没有网络开发和协议设计经验, 别想那么多. 直接上BS, 让客户在浏览器操作.

如果客户端还有一些特殊需求, 比如读写本地文件或者摄像头之类浏览器干不了的活, 用CefSharp自己做个壳.

如果客户端还有实时性比较高的操作, 或者需要服务端主动下发指令的操作, 用websocket.

客户端输入大量数据的话, 估计不是手工输入, 估计是文件导入之类. 耗时很久的用异步线程慢慢传, 用户不用等着.

怕服务端处理不过来的, 用队列. 什么rabbitMQ rocketMQ之类的学学, 懒得学的直接用Redis的List做队列也行

别用十万数据吓唬人, 什么软件也不会同时展示十万数据, 都是分页操作, 十万数据对普通的服务器无论增删改查还是存储都是小case. 

除非是GIS或点线坐标的客户端渲染. 如果大量数据需要在客户端图形方式渲染呈现的, 公用部分在服务端渲染了缓存, 客户端直接请求渲染结果, 每个客户端不一样的部分在客户端渲染.

你现有项目的数据库操作代码, 都用得上, 放在网站后台改改适配就行.

什么加密身份验证之类的, 对网站来说太简单了, 都不用说.

总结来说, 你这就是做个网站, 别想那么复杂, 用户界面就是网页, 通讯协议就是http, 特殊协议用websocket写. 客户端需要
小蜜蜂论坛顶帖机做一些浏览器做不了的事, 就用外壳包装一个浏览器.

发布了74 篇原创文章 · 获赞 0 · 访问量 3084

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104457319