繁体   English   中英

套接字与WCF

[英]Sockets Vs. WCF

我在类似聊天的应用程序上工作,我在客户端使用Silverlight,在服务器端使用wpf。 现在通信基于套接字:我有不同的消息类,我通过TCP序列化和发送。

我开始意识到为每个可能的通信场景创建一个单独的消息类是一个相当大的开销,并考虑转移到WCF。

因此,我需要了解以下事项:

  1. 似乎使用WCF的整个通信基于来自我的WCF服务的客户端callind公开的方法。 有没有办法知道哪个客户端调用某种方法? 这对我的应用来说非常重要。

  2. 当客户端从服务器断开连接(例如关闭运行Silverlight客户端的浏览器窗口)时,WCF是否通知我的应用程序? 这也非常重要。

  3. 方法调用是完全异步的吗? 如果是这样,我是否必须将每个方法调用重新路由到服务器应用程序的主线程?

  4. 每个客户端连接都有自己的线程吗? 如果客户端调用方法说每2秒,服务器(在合理供电的PC上运行)可以处理多少个同时连接? 我只需要一个估计(10,100,1000甚至更多)。 “更多”会很棒;)

也许我完全错了,WCF完全没有基于连接的工作。 然后我必须找到一个解决方法来仍然管理活动连接列表。

谢谢你的帮助! 安德烈

  1. 由于您使用的是Silverlight应用程序,因此可以在消息层上实现UserNamePassword Validator,这会在soap消息中添加一些标头,这可以用于唯一标识客户端,除非客户端是匿名的。 然后,当您需要访问wcf服务中其他位置的用户名时,可以使用System.ServiceModel.OperationContext.Current。

  2. 当客户端断开连接时,服务器不会得到通知,因为默认情况下msgs是“PerCall”,有一种方法,使用Singleton类作为你的ServiceContract和InstanceContextMode.Single,然后使用回调服务实现OperationContract,然后当客户端登录到你的服务他们必须注册回调服务,你的回调服务然后循环通过连接的客户端并检查回调的状态,无论它是否仍然打开,最后删除连接关闭的条目,最终你可以得到你的功能要求。

  3. 异步调用来自客户端,即。 在Silverlight中,所有webservice调用都是异步的,就像在ASP中你可以选择一样,WCF自动处理异步功能,所以你不需要重新路由任何东西,只需将ServiceContract编码为单个线程,一切都会好的

  4. 在Silverlight 3中实现二进制消息编码,为了充分利用你的服务器及其带宽,silverlight不支持原始tcp连接,它必须在http消息中敲击,原因很充分。 每个客户端都可以有多个并发调用(异步记忆),所以为了简单起见,只需将其视为服务器为每个消息调用分配一个单独的线程。 所以回答你刚才所说的问题,1000。

3我知道你可以调用异步。

对于4是的,他们有自己的线程。 WCF非常“大”且复杂,你应该拿一本书来更好地理解它。

我的答案:

  1. 是。 所有通信都基于调用方法。
  2. 总的来说 - 没有。
  3. 您可以同步或异步调用方法。 这是你的选择。
  4. 更多。 我是正确的系统设计案例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM