使用C#在两台计算机之间进行通信

3
所以,我正在尝试使用C#构建一种远程控制应用程序,但我对Socket编程一无所知。我进行了很多搜索,但没有找到我要找的东西。我唯一需要的是在两台计算机之间通过互联网通信,并且我只需要一种能够发送和接收简单字符串变量(例如"robot:move")的方法,但我想不出如何实现,如果有人能帮助我,我会非常感激。
附注:我还没有开始这个项目,所以它是Windows窗体或控制台应用程序都可以。
谢谢提前。
更新:
感谢您的帮助,我学会了如何使用WCF并成功创建了所需的应用程序,但不幸的是,它仅在本地工作,我没有静态IP地址或Windows/IIS托管来将其托管到Internet上。我唯一拥有的是Linux/Apache主机,我尝试过mono,但没有成功。所以,我想知道是否有任何不同的解决方案来解决我的问题。
另外,是否有其他编程语言像C或JAVA一样可以实现这个? 如果是,请给我一个关于如何做到这一点的链接?

你想使用一个简单的控制台应用程序来完成吗? - Ikaso
1
这个问题有点过于宽泛,如果您不添加更多关于限制和要求的细节,可能会被关闭通过编辑您的问题。我建议不要直接处理sockets,而是使用一个隐藏所有这些东西使其更简单易用的库,比如WCF。然而,一旦您选择了一种技术,如果您迷失或不理解其中的某个方面,请随时提出一个新的具体问题。 - Scott Chamberlain
我是一名网站开发人员,以前从未做过这样的事情,所以对于这个问题的技术不太熟悉,但我一定会深入了解WCF。谢谢你的回答。 - Ashkan
“两个程序之间相互通信”的通用术语(无论是通过互联网还是在同一台计算机上的两个程序之间)称为进程内通信,或IPC。这是一个很好的MSDN页面,解释了各种IPC方法的优缺点,希望能帮助您缩小搜索范围。(WCF实际上充当各种形式IPC的包装器,因此您可以使用套接字、命名管道或邮槽等方式进行WCF,而对代码进行非常少的更改。) - Scott Chamberlain
@Ikaso 不是的,请看我在链接页面上提供的前两个要点,以确定使用哪种IPC方法:“*- 应用程序是否需要能够与运行在网络上其他计算机上的其他应用程序通信,或者仅需要与本地计算机上的应用程序通信即可?”和“- 应用程序是否需要能够与可能在不同操作系统(如16位Windows或UNIX)下运行的其他计算机上运行的应用程序通信?” - Scott Chamberlain
显示剩余3条评论
4个回答

4

更新:5年后

我现在会使用带有ProtoBuf序列化的gRPC。这将允许您在客户端和服务器端使用不同的语言。 ProtoBuf也是完全兼容的(支持向前和向后兼容)。以下是“入门指南”文档:https://grpc.io/docs/quickstart/csharp.html


我认为对于您来说,最好的解决方案是使用WCF服务。 http://msdn.microsoft.com/en-us/library/ms734691(v=vs.110).aspx 以下是上述链接中的一个简短示例:
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}

和客户端

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint"));
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

重点在于你有一个合同(接口)和一个实现该接口的服务(类)。然后当这个服务托管在Web、表单或控制台应用程序中时,您可以从另一个应用程序添加对该服务的引用,不管是什么——有多种传输(绑定)可用。这里是MSDN上入门部分的链接 http://msdn.microsoft.com/en-us/library/ms731067(v=vs.110).aspx

1
谢谢您的有益回答,我会尝试使用WCF。 - Ashkan

0

C# 中有多种组件间通信的方式:

  1. 套接字
  2. 使用 .NET Remoting [已过时]
  3. 使用 WCF
  4. 使用 WebClient

选择使用哪种方式取决于项目的目的。建议阅读每种方式并决定哪种适用于您的问题。


.NET Remoting在使用上与WCF几乎相同,但Remoting已被弃用,不建议在新的软件项目中使用。 - Scott Chamberlain
@ScottChamberlain - WCF是为面向服务架构设计的。并不是所有应用程序都需要SOA。现在,虽然 .Net Remoting 是一种较旧的技术,但我认为它并没有被弃用。你有看到微软发布这样的声明吗? - Ikaso
1
.Net Remoting的MSDN页面的顶部以粗体字写着:"此主题特定于已保留用于与现有应用程序向后兼容的传统技术,并不建议用于新开发。分布式应用程序现在应使用 Windows Communication Foundation (WCF) 进行开发。" - Scott Chamberlain
@ScottChamberlain - 谢谢,我已经更新了我的答案。 - Ikaso

0
如果计算机在同一网络上,我将使用 TCPListenerTCPClient 以及 StreamReaderStreamWriter 类来建立通信。它们需要 IP 地址和端口进行通信。
只要您能解决防火墙问题,它们也可以用于互联网通信。

说实话,我认为这不是一个好主意,直接使用TCP(套接字)进行工作,特别是如果你是新手,第一次尝试就很难做到完美。对于像OP所描述的情况,有许多更好的解决方案可用(在.NET本身和免费的第三方库中),这些解决方案更容易使用,需要更少的代码来设置。 - Scott Chamberlain

-1

SignalR需要ASP.net吗?不太清楚OP是否在使用它。 - Scott Chamberlain
SignalR在这种情况下确实不适用。 - Dave Gordon
SignalR没有提供一种好的/实用的方式来直接获取请求的响应。例如,假设我从Web API服务控制器类向.NET客户端发出了请求,我没有很好的方法在该控制器类中获取该请求的响应。 - zappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接