我有两个Windows窗体应用程序,一个用作服务器(即 Winform:服务器角色),另一个用作客户端(即 Winform:客户端角色)。在我的局域网设置中,有6台PC和这些PC通过8端口交换机相互连接,每台PC都有多个LAN卡。
有一台PC运行[Winform:Server角色],另外五台运行[Winform:客户端角色]。在 [Winform:服务器角色] 中,我使用以下代码获取本地IP address和端口号, [Winform:服务器角色] 将收听根据此自动分配的IP地址和端口号,对所有传入的TCP请求。
Dim Listener As System.Net.Sockets.TcpListener
Dim Client As New System.Net.Sockets.TcpClient
Dim Message As String = ""
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Listener = New System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 0)
Listener.Start()
End Sub
所有 [Winform:客户角色] 如何在运行时知道我的 [Winform:服务器角色] IP地址和端口号?
我需要澄清我的意图。我目前处理我的意图可能不正确。我尝试创建一个“零配置客户端 - 服务器网络”,这就是插件和插件。玩。服务器将知道客户端的位置,反之亦然。我知道有一个程序(即MaxiVista)完全做到了。
MaxiVista有两个应用程序,即服务器和客户端。用户只需在指定为服务器角色的PC中执行服务器应用程序,并在另一台指定为客户端角色的PC中执行客户端应用程序。然后,服务器将能够在同一LAN中找到所有正在执行的客户端。
我的意图就是这样。在同一局域网内即插即用“零配置客户端 - 服务器网络”。
答案 0 :(得分:3)
嗯,他们不是,真的。
您可以为例如配置DNS yourappserver
指向您的服务器,然后让客户端连接到该服务器,但这显然有点复杂(加上硬编码值不是一个很好的方法)。
您可以使用的是某种服务公告 - 例如通过mDNS。这是通过让服务器定期宣布“我是一个小服务器,短而粗壮(WhateverYourAppIsCalled在端口12345上的服务器)”以及您的客户端来监听此类请求,甚至是请求它们(“是否有服务器WhateverYourAppIsCalled around这里?”)。另见:http://en.wikipedia.org/wiki/Zero_configuration_networking#Service_discovery
(在紧要关头,您可以让服务器向网络广播其存在并让客户端监听此类广播,但之后您基本上重新实现了mDNS)
答案 1 :(得分:2)
客户端无法自动计算出服务器的IP地址。以下是解决问题的一些选择:
答案 2 :(得分:2)
从知名机器名称到IP地址的映射由命名服务完成,DNS是标准服务。如果无法使TcpClient.Connect(string,int)正常工作,请与LAN管理员联系。
您无法让服务器像这样开始侦听端口0。它必须是众所周知的端口号,否则客户端将不知道在Connect()调用中使用哪个端口号。选择一个数字,任何数字,超过一千。像1667.如果与使用相同端口号在该机器上运行的另一个TCP服务器发生冲突,那么您将发现。在客户端上,服务器名称和端口号属于设置,以便LAN管理员可以轻松更改。