【问题标题】:How can I send data over the internet using a socket?如何使用套接字通过 Internet 发送数据?
【发布时间】:2009-04-07 14:46:22
【问题描述】:

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

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

使用套接字是否足够,还是需要 HTTP?

【问题讨论】:

  • 在您所说的层上,LAN 和 Internet 之间没有太大区别(您实际上只需要考虑 NAT)。您要传输什么类型的数据?如果您面向多个平台,请记住 ASCII 数据表示因操作系统而异。

标签: c# sockets networking


【解决方案1】:

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

但是,由于涉及 Internet(不是最快的连接),为了方便起见,我建议您最好选择通过 http 进行远程处理。这样,即使将来设置发生变化,并且防火墙/代理参与其中,您也不用担心。

【讨论】:

  • 好的,没关系,这个答案被否决了。我想知道原因 - 仅用于自学:)
  • 赞成,因为我认为没有理由反对。 :) 另外我喜欢这个答案。
  • @SunnyMilenov 你能提供更多关于 opt 的信息吗?
【解决方案2】:

如果您只想将原始数据从一台机器传输到另一台机器,那么使用 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();

【讨论】:

  • StartTCPServer 是 ThreadPool.QueueUserWorkItem() 的有效回调吗?
【解决方案3】:

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

UDP - 这是一种发送后忘记发送数据包的方法。适用于不一定要 100% 正确的流媒体。

好的:

  1. 无需连接。
  2. 非常轻巧。

坏处:

  1. 无法保证您的数据包到达目的地(尽管大多数情况下他们都会到达)。
  2. 数据包可能会按照您发送它们的顺序到达。
  3. 不保证它们的内容与您发送数据包时的内容相同。

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

好的:

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

坏处:

  1. 需要建立连接。
  2. 比 UDP 开销大得多。

优点和缺点列表绝不是完整的,但它应该足以让您有能力做出明智的决定。如果可能,您应该利用已经存在的基于application layer 的协议,例如HTTP 如果您正在传输ASCII 文本,FTP 如果您正在传输文件等等。

【讨论】:

    【解决方案4】:

    您可以使用 .Net 的 Socket 类来实现,也可以使用更方便的 TcpClient 类。

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

    您的本地 IP 地址或路由器的地址并不重要。但是,您需要知道要连接的远程主机的 IP 地址。您可以通过以下方式获得:

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

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

    从您的问题来看,您似乎对套接字很陌生,因此阅读 this 可能也会有所帮助

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        当然,如果您必须通过慢速互联网连接传输数十或数百兆字节的数据,我不确定它的扩展性如何。它确实提供异步 I/O,但我认为您无法获得进度指示器,而且肯定没有恢复功能。

        补充:您也可以继续使用您的套接字。通过 Internet 连接到服务器不需要额外的工作。只需指定服务器的 IP 地址,然后就可以走了。您的操作系统会处理所有血腥细节,例如路由器、丢失的数据包等。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            如果要向透明连接的服务器发送数据 到互联网,就像连接到它的 IP 地址一样简单。

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

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

            【讨论】:

              猜你喜欢
              • 2021-01-25
              • 1970-01-01
              • 2010-11-28
              • 1970-01-01
              • 2016-04-06
              • 1970-01-01
              • 2011-06-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多