.NET 桌面客户端应用程序:套接字还是 HTTP 请求? [关闭]

Posted

技术标签:

【中文标题】.NET 桌面客户端应用程序:套接字还是 HTTP 请求? [关闭]【英文标题】:.NET desktop client app: sockets or HTTP requests? [closed] 【发布时间】:2016-02-16 21:30:12 【问题描述】:

我正在尝试设置一个可以与服务器异步通信的 Windows 服务,其想法是传输一些字符串。格式,嗯,真的没那么重要。

所以,在本地网络中,我很酷,我什至编写了一个简单的移动应用程序来测试它的请求,并且它可以正常工作。

问题是我现在必须让它从网络外部工作,并且要实现它,我必须从路由器配置中转发端口,这对于在用户计算机上部署确实不是一个理想的方案。

我已经读过这是你通常使用套接字的东西,但据我所知,至少对于 .NET,服务器必须具有相同的框架(如果不是这样,请纠正我),并且在我的情况下,服务器不是 .NET。

老实说,我对客户端-服务器交互知之甚少,而且在阅读 Microsoft 官方文档时,我在概念上存在巨大的障碍,所以从头开始吧。我从文档中瞥见了 WinSock 和 RPC,但 C# 实现感觉就像胶带,真的是最后的手段。

也就是说,我想我需要提出六个问题:

    纯 HTTP 是个坏主意。对吧? 鉴于这种情况,我需要套接字吗?如果是的话, 如何在服务器上实现它?另外, 比使用 RPC 更好吗? RPC 究竟是如何工作的?在官方文档之前我需要阅读什么? 套接字实际上是如何让客户端从本地网络外部接收异步调用的? (需要,我看是可以的)

如果我在这里混淆概念,请原谅我,感谢阅读。

版主注意事项:如果这是一个重复的问题,或偏离主题,或因任何其他原因无效,请首先帮助我,为我指明正确的方向。我试图在发布之前对其进行很好的搜索,但由于我对大多数概念不太熟悉,因此我可能会错过这个。谢谢!

【问题讨论】:

问题不清楚,有很多误解,而且太宽泛,无法在答案中解释。继续阅读文档... 你说的是真的。但是,嘿,这就是我问的原因。 :) 什么不清楚? too broad to explain in an answer。 (阅读 SO 规则)所以我投票决定关闭....Jeroen van Langen 以下是您可以获得的最佳答案,如果足够,请接受答案,如果没有,那么您就在错误的网站..... 澄清一下:我的回复中没有问号。 【参考方案1】:

这里有一些答案:

问题是我现在必须让它从网络外部工作,并且要实现它,我必须从路由器配置转发端口,这确实不是用户部署的理想方案机器。

仅当从网络外部连接到网络内部的计算机(在路由器后面)时才需要端口转发。因此,如果用户机器直接连接到 Internet 上的计算机,则不需要端口转发。如果 Internet 上的计算机连接到本地网络中的计算机,则需要在路由器中转发一个端口。所以它只会影响您的网络。


我已经读过这是你通常使用套接字的东西,但据我所知,至少对于 .NET,服务器必须具有相同的框架(如果这不是真的,请纠正我),在我的情况下,服务器不是 .NET。

不,.NET 的套接字可以与其他语言/平台的任何套接字实现进行通信。只有在传递二进制文件时,您才应该注意字节序。


老实说,我对客户端-服务器交互知之甚少,而且在阅读 Microsoft 官方文档时,我有一个巨大的概念障碍,所以从头开始吧。我从文档中瞥见了 WinSock 和 RPC,但 C# 实现感觉就像胶带,真的是不得已而为之。

在我看来,.NET 具有处理套接字的坚实基础。实施了许多技术。对于许多客户端来说,异步套接字非常可扩展


也就是说,我想我需要提出六个问题:

_Plain HTTP 是个坏主意。对吗?__

为什么你会认为普通 HTTP 不好?这在服务器使用其他语言编写时非常有用,例如 PHP/Python/ASP.NET 任何使用 HTTP 的语言。如果您要发送用户私人信息,您应该对其进行哈希/加密


考虑到这种情况,我需要套接字吗?如果是的话,

取决于如何连接到服务器..


如何在服务器上实现它?还, 比使用 RPC 更好吗?

我只使用了WebServices形式的RPC,你只能在de server实现它的时候使用它。 WebServices 有一些好处。


RPC 究竟是如何工作的?在官方文档之前我需要阅读什么?

在此处阅读更多信息:https://msdn.microsoft.com/en-us/library/ms950421.aspx


socket 做了什么来让客户端从本地网络外部接收异步调用? (需要,我看是可以的)

网络内部和外部的通信没有区别。通过套接字直接通信始终是异步的。


问候,

【讨论】:

嗨,Jeroen,感谢您的回答。使用纯 HTTP 的问题是我必须进行端口转发,因为客户端将在不同的网络中,并且它将接收异步请求,我建议这可能是个坏主意,因为我必须使用其他东西,所以它不能只是“手动”请求,也许这还不够。我的不好,我不清楚那里。就像在帖子中一样,我确实承认有点迷路。您的回答为我澄清了一些概念。但是有没有另一种方法不必为客户端转发路由器中的端口? 客户端不需要任何端口转发。只有在路由器后面的服务器传入连接时才需要端口转发。你能描述一下你的网络图是什么样子的吗?例如:服务器在哪里运行,客户端在哪里。 如果服务器和客户端都是用 C# 编写的,我会选择 WebServices。如果您的客户端应该连接到第 3 方软件,我可能会选择带有 JSON 消息的 HTTPRequests 服务器和客户端需要监听异步请求,差不多是两台服务器。服务器暴露在互联网上,但客户端位于路由器后面。【参考方案2】:

您应该使用 Websockets。不知道你为什么说服务端和客户端应该有相同的框架,其实不是这样的,我用的是C#客户端和NodeJs后端。

https://msdn.microsoft.com/en-us/library/system.net.websockets.websocket(v=vs.110).aspx

【讨论】:

感谢科斯塔斯的回答,我会读一读。是否有与 Windows XP 及更高版本兼容的 WebSockets 等价物? 我不认为这是一个糟糕的答案...

以上是关于.NET 桌面客户端应用程序:套接字还是 HTTP 请求? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 桌面应用程序 - 与 Web 服务的套接字通信

桌面应用程序和服务器之间的套接字通信

WPF开发桌面客户端需要安装Framework吗?比如我要开发个...

WebSockets - 异常 HTTP/1.1 101

.NET 库,可以将套接字从 HTTP 切换到 WebSocket 协议

Go 网络编程示例