0

我用 c# 编写了一个简单的本地信使供自己使用。现在它可以通过本地网络(局域网,wifi)工作并且工作正常。现在我想把它给我的朋友并通过互联网使用它,但不知道如何使用除本地主机之外的不同 ip。

如有任何帮助,我将不胜感激。提前致谢。


    private void InitializeConnection()
    {

        ipAddr = IPAddress.Parse(txtIp.Text);
        tcpServer = new TcpClient();
        tcpServer.Connect(ipAddr, 1986);

        Connected = true;
        UserName = txtUser.Text;

        txtIp.Enabled = false;
        txtUser.Enabled = false;
        txtMessage.Enabled = true;
        btnSend.Enabled = true;
        btnConnect.Text = "Disconnect";

        swSender = new StreamWriter(tcpServer.GetStream());
        swSender.WriteLine(txtUser.Text);
        swSender.Flush();

        thrMessaging = new Thread(new ThreadStart(ReceiveMessages));
        thrMessaging.Start();
    }

这是客户部分

    public ChatServer(IPAddress address)
    {
        ipAddress = address;
    }

    private Thread thrListener;

    private TcpListener tlsClient;

    bool ServRunning = false;

    public static void AddUser(TcpClient tcpUser, string strUsername)
    {
        ChatServer.htUsers.Add(strUsername, tcpUser);
        ChatServer.htConnections.Add(tcpUser, strUsername);

        SendAdminMessage(htConnections[tcpUser] + " has joined us");
    }

和这个服务器部分。

4

1 回答 1

3

介绍

为了能够让其他用户连接到您的计算机,您需要做很多事情。希望这应该可行,但网络通常会变得复杂,并且并非所有网络都运行相同。我假设您在您可以访问的某种路由器后面运行它。网络很复杂,这就是为什么这个答案非常长的原因(如果你在阅读其余部分时质疑自己)。在大多数情况下,它是非常直截了当的,但可能需要一些时间。

在开始之前,只需:

预警

从安全角度考虑,就像计算机和一般网络上的几乎所有东西一样,实际上并没有所谓的“完全安全”(至少据我所知)。与网络一样,打开端口也不是完全安全的。我不是一流的安全专家,但通过这样做,您允许其他计算机与您的计算机发送和接收数据。在您只是进行简单的文本聊天的情况下,这应该是安全的,但在其他情况下,这可能不一样。在处理 SSH 和 FTP 等更复杂和重要的情况下,涉及到更多的安全性。就像警告一样,在弄乱您的网络或一般计算机时,请务必小心。

入门

无论如何,(如果我还没有吓跑你的话)这些是我必须采取的步骤才能让你的聊天服务器正常工作:


转发路由器上的端口

您要做的第一件事是转发或打开路由器上的端口。好吧,在您甚至可以这样做之前,您需要了解有关网络的几件事:

基本上,您的路由器是将您的计算机网络连接到互联网并允许通过端口进行连接。如果您不了解端口是什么,它是用于建立互联网连接的端口,基本上就像门牌号码与街道地址一样。它告诉它在那条街道上的哪个地方,并且比街道地址更具体。就网络而言,这是一个数字,用于说明通信的具体位置。端口号(“门牌号”)告诉计算机的 IP 地址(“街道地址”)要连接的位置。

具体来说,端口号是一个 16 位无符号整数,范围从 0 到 65535(但根据Wikipedia,端口号 0 实际上不能使用)即使这是一个 16 位无符号整数,在 C# 中是 aushort或 a ,当UInt16使用TcpClientTcpListener,他们改为使用有符号的 32 位整数,而不是标准intInt32. 此外,例如,端口通常在 IP 地址之后用冒号 (" :") 表示,123.45.67.89:80但在其他情况下可能会有所不同。这是使用 IPv4,但也有我尚未使用的 IPv6。

现在,如何转发端口,为什么需要这样做?转发端口所做的是将连接到路由器上某个端口的连接转发到路由器后面的计算机。并不总是有一种简单、直接和直接的方式来做到这一点,因为路由器公司有不同的方式来实现这一点。通常,要弄清楚这一点,您可以在 Google 上获取有关如何在特定路由器上转发端口的说明,例如,您可以搜索“路由器公司名称路由器上的转发端口”来找到它。为此,在开始之前,您可能还需要一些东西:

  • 您将需要您的路由器管理员用户名和密码,这通常不是(并且可能不应该)用于连接它的。如果您不知道它是什么,那么设置您的路由器的人应该知道。一旦你完成了这项工作,你就可以继续前进了。
  • 您可能还需要计算机的本地 IP 地址,该地址用于寻址路由器网络中的计算机。要找到它,您的路由器可能会告诉您它是什么,但如果您似乎找不到它,这里是在 Windows 上执行此操作的步骤。
    1. 打开命令提示符
      • 通过转到Start >> Run...或按 Win+R打开运行对话框
      • 输入cmd并按回车
    2. ipconfig通过输入并按回车键来 运行以查找您的计算机 IP 地址
      • 您应该会看到网络接口连接列表
      • 要找到我们正在寻找的那个,您需要找到您用来通过路由器连接到互联网的网络连接。它在计算机上可能有所不同,但在我的情况下,它的命名Wireless LAN adapter Wireless Network Connection是因为我使用的是笔记本电脑。我想,这个名字可能就LAN在其中。
      • 这不应该有:Media State . . . . . . . . . . . : Media disconnected在它下面列出,因为您需要连接到您的路由器。如果你不是那么简单地这样做。
      • 相反,应该在IPv4 Address. . . . . . . . . . . :旁边列出您的实际计算机的 IP 地址。这是您要转发其端口的计算机的 IP 地址。当然,如果您使用的是使用 IPv6 的路由器,这可能会有所不同。

此外,在执行此操作的过程中,您正在使用的端口号可能会被另一个进程或服务占用。这没关系,也很容易解决;您只需要更改端口号。例如,您将想要尝试一个较高的数字,例如 8500,直到找到一个有效的数字。获得该号码后,只需更新代码中的端口号。为了使这更容易,拥有一个存储它的常量要容易得多,例如:

const int Port = 8500;

因此,您可以让客户端连接:

tcpClient.Connect(ipAddress, Port)

然后让服务器监听

TcpListener tcpListener =  new TcpListener(ipAddress, Port);   

与其他全局变量(例如您可能拥有的端口号)一样,创建全局变量 class可能会更好,但同时,使用它也可能会引入其他问题,例如使用线程的全局属性。只是一个建议和提醒。

不过,一旦您成功完成端口转发,您就可以继续进行更简单的部分,让您的朋友实际连接到您的服务器。


获取路由器的 IP 地址

一旦你设法做到了所有这些,你可能应该拍拍你的后背,因为这是让你的路由器与你试图做的事情合作的真正实际部分。现在您只需将您的 IP 地址、端口号,当然还有您的客户端程序提供给您的朋友,这样他或她就可以连接到服务器。要获取路由器的公共 IP 地址,您可以访问具有讽刺意味的网站http://www.whatismyip.com/。在这里,您可以获得您的公共 IP 地址,但还要确保它在其下方显示“未检测到代理”。如果您使用的是代理,希望您知道它是什么,并且可以连接到互联网而无需获取您的 IP 地址。(相信我,你不会要我解释一下现在想要代理)

现在,一旦你得到了它,你就会想把那个 IP 和你的端口号发送给你的朋友。明智地说,您不希望公开显示它,因为您可能不希望一群随机的人试图闯入您的网络。只要您的朋友不公开展示它,通过 IM 或电子邮件发送它应该(希望)没问题。因此,在发送您的 IP 地址时,请谨慎行事。

完成此操作后,请不要忘记实际启动服务器!如果您的服务器没有运行,就无法与客户端通信并接受传入连接。这将避免很多不小心忘记的挫败感。


结论

希望这将帮助您能够创建一个很酷的聊天程序,并在此过程中了解其他一些事情。我真的希望这不是那么长,但是网络在大多数情况下确实很复杂。

希望这对您有很大帮助!

于 2012-07-30T07:35:18.713 回答