通过互联网传输数据

本文关键字:数据 传输 互联网 | 更新日期: 2023-09-27 18:29:52

我知道有人问我这个话题,我用了很多来自互联网的帖子,比如codeproject,stackoverflow,但我仍然无法在2台不在局域网上的计算机之间传输数据。

局域网传输和互联网传输有区别吗?我必须有一个临时服务器才能完成这项任务吗?

我的程序在局域网上运行,但当我尝试在广域网中测试程序时,我在离我很远的朋友的电脑中设置了服务器(接收),然后,在我的电脑中,在客户端程序中,我用朋友电脑的IP替换了局域网的IP,但它不起作用。我误解了什么吗?

如果你不理解我,请给我解决方案的链接,或者教我如何在2台不在局域网上的计算机之间传输数据。非常感谢你,为我糟糕的英语感到抱歉。

代码:(仅连接)

接收:(我在我朋友的机器上设置了这个)

namespace RecieveFile
{
public partial class Form1 : Form
{
#region Variables
    private Thread thrDownload;
    private Stream strLocal;
    private NetworkStream strRemote;
    private TcpListener tlsServer;
    #endregion
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {            
        thrDownload = new Thread(StartRecieving);
        thrDownload.Start();
   }
    public void StartRecieving()
    {
        try
        {
            string hstServer = Dns.GetHostName();
            IPAddress ipaLocal = Dns.GetHostEntry(hstServer).AddressList[0];
            if (tlsServer == null)
            {
                tlsServer = new TcpListener(IPAddress.Any, Convert.ToInt32(29250));                
            }
            tlsServer.Start();
            TcpClient tclServer = tlsServer.AcceptTcpClient();
            MessageBox.Show("Connection has been created");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        finally
        {
            strLocal.Close();
            strRemote.Close();
            MessageBox.Show("In finally");
            StartRecieving();
        }
    }
 }
}

发送:(我在我的机器上设置了这个)

private void Form1_Load(object sender, EventArgs e)
    {
     //171.255.9.234 is my friend's IP
     //if this ip is a ip of computer in my LAN network, it can work
        ConnectToSever("171.255.9.234", 29250);
    }
public void ConnectToSever(string severIP, int severPort)
    {
        tcpClient = new TcpClient();
        try
        {
            tcpClient.Connect(severIP, severPort);
            MessageBox.Show("Connection has been created!","Message");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }

通过互联网传输数据

如前所述,如果没有实际的代码示例,就不可能生成特定的语句。

也就是说,代码在局域网上工作,但不能在互联网上工作的通常原因是连接的服务器端位于代理、NAT路由器或防火墙后面。

您必须确保,如果服务器主机运行防火墙,则防火墙设置已配置为允许网络流量通过您期望的端口。对于Windows防火墙,默认情况下,当您第一次运行允许您授予访问权限的未经授权的程序时,Windows将显示提示。Windows上的不同防火墙软件,当然还有其他操作系统上的不同的防火墙,可能也可能不起类似的作用。

同样,如果服务器主机使用NAT路由器进行互联网连接(常见于住宅和中小型企业互联网连接),则需要配置NAT路由器的"端口转发",以将给定端口上的入站流量传送到指定计算机。如果涉及代理服务器,也会出现类似的问题。

还要注意,如果涉及NAT路由器或代理,则需要在客户端软件中配置为服务器地址的IP地址是,而不是用于托管服务器进程的实际机器的IP地址(将是LAN地址),而是NAT路由器或代理服务器使用的面向互联网的地址。

以上所有假设都是IPv4。如果您正在使用IPv6(在互联网上仍然不常见,但一些互联网提供商支持端到端),那么代理和NAT问题不应该是问题,但防火墙仍然是问题。

您可能需要在两个路由器中为程序用于通信的端口设置一些Port Forwarding,以使其在WAN上工作。在局域网中,这更容易,因为它通常默认为所有端口打开。

如何设置端口转发取决于您的路由器,但一些信息可以在http://portforward.com