如何通过互联网使用我的C#messenger?

时间:2012-07-29 16:45:21

标签: c# .net messenger

我用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");
    }

和这个服务器部分。

1 个答案:

答案 0 :(得分:3)

简介

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

在你开始之前,只需要一个:

预警

明智地考虑安全性,就像计算机上的几乎所有内容以及一般的网络一样,并没有真正被称为“完全安全”的东西。 (至少据我所知)。与网络一样,开放端口并不完全安全。我不是顶尖的安全专家,但通过这样做,您允许其他计算机与您的计算机一起发送和接收数据。在您进行简单的文本聊天时,这应该是安全的,但在其他情况下,这可能不一样。对于更复杂和重要的案例,例如处理SSH和FTP,涉及更多安全性。正如警告一样,请确保在弄乱网络或一般计算机时要小心。

入门

无论如何,(如果我还没有吓到你)这些是我必须采取的步骤,以使你的聊天服务器工作:


转发路由器上的端口

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

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

具体来说,端口号是一个16位无符号整数,范围从0到65535(但根据Wikipedia实际上不能使用端口号0)即使这是一个16位无符号整数,它也是C#中的ushortUInt16,当使用TcpClientTcpListener时,他们改为使用带符号的32位整数,而不是标准的{{1}或int。此外,端口通常用带有冒号(" Int32")的IP地址表示,例如:,但在其他情况下可能不同。这是使用IPv4,但也有IPv6,我还没有使用过。

现在,转发端口怎么样?为什么需要这样做?转发端口的作用是将路由器上的某个端口转发到路由器后面的计算机。由于路由器公司有不同的方法来实现这一点,因此并不总是有一种简单,直接和前瞻性的方法。一般来说,为了解决这个问题,您可以通过Google获取有关如何转发特定路由器端口的说明,例如,您可以在路由器公司名称上搜索"转发端口路由器"找到它。要做到这一点,在开始之前你可能还需要一些东西:

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

此外,在执行此操作的过程中,您正在使用的端口号可能由另一个进程或服务获取。这很好,很容易修复;你只需要改变端口号。你会想要尝试一个像8500这样的高数字,直到找到一个有效的数字。获得该号码后,只需更新代码中的端口号即可。为了使它变得更加容易,可以更容易地获得存储它的常量,例如:

IPv4 Address. . . . . . . . . . . :

那么你可以让客户端连接:

const int Port = 8500;

然后让服务器听

tcpClient.Connect(ipAddress, Port)

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

虽然,一旦您设法完成转发端口,您可以继续前往让您的朋友实际连接到您的服务器的更简单的部分。


获取路由器的IP地址

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

现在,一旦你有了这个,你就会想要把这个IP以及你的端口号发送给你的朋友。要明白这一点,你不要公开展示它,因为你可能不想让一群随机的人试图闯入你的网络。只要您的朋友没有公开显示它,通过即时消息或电子邮件发送它应该(希望)是正常的。因此,在发送您的IP地址时,请巧妙地了解它。

完成后,不要忘记实际启动服务器!如果服务器没有运行,则无法与客户端通信并接受传入连接。这样可以避免因意外忘记造成很多挫折。


结论

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

希望这对你有所帮助!