如何使用套接字通过互联网发送数据?

我想通过桌面应用程序通过互联网发送数据。 我对sockets有点了解。 我已在局域网内传输数据,但现在我想通过互联网传输数据。 传输大量和小量数据的最佳方法是什么?

我的系统连接到可以访问互联网的服务器。 我系统的IP地址是动态的。 我不知道如何将数据发送到连接到互联网的另一个系统。 我需要找到路由器地址吗? (我的IP地址生成为192.168.1.15)。

是否使用了足够的套接字,或者是否需要HTTP?

如果不涉及防火墙/代理,套接字就足够了。

但是,由于涉及互联网(不是最快的连接),我建议为了方便起见,你应该更好地选择通过http进行远程连接。 这样,即使将来设置发生变化,防火墙/代理也参与到等式中,您也不必担心。

如果您只想将原始数据从一台机器传输到另一台机器,那么使用TCP套接字非常容易。

这是一个简单的例子。

服务器:

ThreadPool.QueueUserWorkItem(StartTCPServer); private static void StartTCPServer(object state) { TcpListener tcpServer = new TcpListener(IPAddress.Parse("192.168.1.15"), 5442); tcpServer.Start(); TcpClient client = tcpServer.AcceptTcpClient(); Console.WriteLine("Client connection accepted from " + client.Client.RemoteEndPoint + "."); StreamWriter sw = new StreamWriter("destination.txt"); byte[] buffer = new byte[1500]; int bytesRead = 1; while (bytesRead > 0) { bytesRead = client.GetStream().Read(buffer, 0, 1500); if (bytesRead == 0) { break; } sw.BaseStream.Write(buffer, 0, bytesRead); Console.WriteLine(bytesRead + " written."); } sw.Close(); } 

客户:

  StreamReader sr = new StreamReader("source.txt"); TcpClient tcpClient = new TcpClient(); tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.15"), 5442)); byte[] buffer = new byte[1500]; long bytesSent = 0; while (bytesSent < sr.BaseStream.Length) { int bytesRead = sr.BaseStream.Read(buffer, 0, 1500); tcpClient.GetStream().Write(buffer, 0, bytesRead); Console.WriteLine(bytesRead + " bytes sent."); bytesSent += bytesRead; } tcpClient.Close(); Console.WriteLine("finished"); Console.ReadLine(); 

有关您的连接需求的更多信息,以便为您提供适当的解决方案。 您可以使用许多协议,并且所有这些协议都需要权衡。 您可能会选择以下两个传输层之一 :

UDP – 这是一种发送数据包的“发送 – 忘记”方法。 适用于不一定必须100%正确的流媒体。

好处:

  1. 无需连接。
  2. 很轻巧。

坏事:

  1. 无法保证您的数据包到达目的地(尽管他们大多数时间都是这样做的)。
  2. 数据包可以按照您发送的顺序到达。
  3. 不保证其内容与发送数据包时的内容相同。

TCP – 这是一种基于连接的协议,可保证可预测的行为。

好处:

  1. 您将确定数据包是否已到达目的地。
  2. 数据包将按您发送的顺序到达。
  3. 保证99.999999999%的数据包到达时内容不变。
  4. 流量控制 – 如果发送数据包的机器发送得太快,接收机器可以限制发送方的数据包发送速率。

坏事:

  1. 需要建立连接。
  2. 比UDP更多的开销。

利弊列表并不完整,但它应该是足够的信息,使您能够做出明智的决定。 如果可能,您应该利用已经存在的基于应用程序层的协议,例如,如果要传输ASCII文本,则使用HTTP;如果要传输文件,则使用FTP ,等等。

您可以使用.Net的Socket类来完成它,或者您可以使用更方便的TcpClient类。

首先,您需要确定要与之通信的服务器。 它是HTTP服务器还是FTP服务器? HTTP和FTP都是应用程序级协议,它们在(使用)套接字之上实现,这实际上是一个传输层接口。

您的本地IP地址或路由器的地址确实无关紧要。 但是,您需要知道要连接的远程主机的IP地址。 你可以通过以下方式获得:

 IPHostEntry host; host = Dns.GetHostEntry(hostname); 

您可能还想在使用套接字时考虑其他问题,例如使用超时来屏蔽故障,在传输大文件时恢复上传/下载的可能性等。如果您花一些时间在网上查看,您应该能够找到更高级别的HTTP / FTP apis,可以让您更轻松地处理文件传输。

从你的问题来看,你似乎对套接字来说很新,所以阅读这个也可能有所帮助

在你的问题中你混合了不同的东西。 套接字是网络通信的抽象。 你肯定需要一个套接字来通过网络进行通信。 但是,您可能不会看到使用套接字(如在Web浏览器中)。 Http是一种通信协议。 这是通过沟通渠道的。

Visual Studio具有许多用于创建和使用SOAP XML Web服务的良好工具。 如果我是你,我会调查它。 当然,有一些开销,但编码非常容易。

当然,如果您不得不通过慢速互联网连接转移数十或数千兆字节的数据,我不确定这会扩展得多好。 它确实提供了异步I / O,但我认为你不能获得进度指示器,并且最明确的不是恢复function。

补充:您还可以继续使用套接字。 没有额外的工作可以通过互联网连接到服务器。 只需指定服务器的IP地址,即可离开。 您的操作系统将处理所有血腥的细节,如路由器,丢失数据包等。

首先,您应该决定要使用TCP或UDP的协议。 然后你有两个选择:1。使用Socket(更低级别)或2.使用类似TCPClient或UDPClient(它代表一个更高的抽象。我建议(为了乞求第二个选项)。

您想要了解的内容在很大程度上取决于您基础架构的许多部分。

如果要将数据发送到透明连接到互联网的服务器,则只需连接到其IP地址即可。

如果你想通过宽带连接与一些朋友联系,事情变得棘手。 您通常必须为NAT配置两个路由器(或至少是目标路由器)。

熟悉NAT,以及IP路由的基础知识。 您提供的详细信息不足以准确描述您想要做的事情。