我正在制作概念证明 - 可能有一天会成为收入来源 数据流规定必须是客户端 - 服务器应用程序,信息在客户端之间共享,并且应该保持不变。
我有编写独立应用程序的经验,我已经为应用程序建模并编写了客户端。与服务器的通信只是一个存根。
所以现在我有一个带有方法调用的(C#)接口形式的协议 其中四个用于请求信息,两个用于将数据推送到服务器 这些数据属于我希望在另一方面冻结和恢复的类别。
将来我想将客户端移植到其他操作系统上,所以我不想做一些我必须从cratch重写服务器的事情,如果我无法避免的话。
我还希望以不确定的时间间隔更新客户端中的数据。今天我不知道怎么做。
我的应用程序是单线程的, Windows窗体
我的假设是:
*我会在某些形式下使用 TCP / IP 。我必须设置频道,设置IP地址和类似的东西,我知道我必须做什么
*服务器的前端将是多线程,以允许更多的客户端同时与服务器通信。同步将在服务器内部
*预计的数据量,最大:文本1000 * 1kbyte,10个状态的10万个对象。每天20 000次更新。但这是未来的方式。
可能三个最大的问题是
1. 通信协议。如何将我的方法调用,我在界面中的调用映射到可以在TCP / IP通道上传输的内容?
2.我需要一个好的模式建议序列化读取和写入“数据库”,数据库不需要是一个sql server。
3.我是否可以允许服务器发送更新到客户端而不使其成为多线程应用程序,其中一个线程只监听套接字?
如果需要更多信息,我很乐意更新我的问题
提前谢谢。
戈尔根
答案 0 :(得分:0)
SOunds喜欢.Net远程处理的好候选人。
这将抽象出许多低级字节移位,并允许您以域级语言编写通信代码。
答案 1 :(得分:0)
从它的声音来看,WCF就在你的小巷里。虽然一旦你开始深入研究它可能会有点复杂,但事情是相当简单的。这样你就可以让框架处理异步调用并连接它的网络端。
对于服务器向客户端发送更新,您需要查看WCF中的双工绑定以及维护已知(已连接)客户端列表的服务器端。当然,在try-catch块中将任何回调包装回客户端,因为你永远不知道何时会发生打嗝并且客户端突然无法访问。
答案 2 :(得分:0)
我只是想为Agent_9191的答案添加一些内容,并记录我为子孙后代所采取的步骤:
问题1
仔细阅读Getting started tutorial (不,我没有,但我希望我这样做)
将示例更改为我自己的界面
默认生成的代理会非常依赖地更改界面;由于传递机制,所有集合类都是对数组进行的,并且您要传输的所有类都将被删除所有方法。要在服务器和客户端访问域类,请遵循this post
将使用的域类必须与来自System.Runtime.Serializion.dll的[DataContract]
和[DataMember]
序列化
这些WCF samples帮助我理解了发生了什么
问题2
在服务中添加了一个静态实例
private static MyManager myManager = new MyManager();
只需转发所有来电
public Project[] GetProjects() { return myManager.GetProjects(); }
问题3
双向合约:How to: Create a Duplex Contract
我现在将状态保存在内存中而不是数据库中,当我改变时,我会重新考虑这种方法。
答案 3 :(得分:-1)
1)请详细说明这个问题。我不完全明白你想要解释的是什么。
2)我不确定你的意思是什么(对编程意义上的模式一无所知)但是异步读写是不明智的,这样你只有在拥有某些东西时才能访问数据库读/写
3)是的,这是可行的,但你真的应该创建另一个线程来更新你的客户。出于某些原因,这是可取的,但主要是您希望尽可能地划分程序逻辑,以便更容易地隔离软件中的问题。