我正在用VB.net开发一个科学软件,打算发布。应用程序的一部分将涉及与服务器(和其他客户机)的通信。对于所有的意图和目的,通信将像一个聊天应用程序。
我使用套接字开发了这个软件,在家里用本地网络测试时效果很好。下面是我发送消息的基本方法:
Dim serverIPString as String = "192.168.1.5"
Dim serverPort as long = 65500
dim messageString as String = "Hello"
Dim Client As New System.Net.Sockets.TcpClient(serverIPString, serverPort)
Dim Writer As System.IO.StreamWriter(Client.GetStream())
Writer.Write(messageString)
Writer.Flush()
Writer.Close()
我是这样听的:
Public Class TCPIPListener
Dim initalised As Boolean = False
Dim port As Long
Dim IP As System.Net.IPAddress
Dim ourListener As TcpListener
Dim ourClient As TcpClient
Dim ourMessage As String
'''''''''''
'' ctors ''
'''''''''''
Public Sub New()
initalised = False
End Sub
'Takes IP and port and starts listeing
Public Sub New(inIP As String, inPort As Long, inExchange As messageExchange)
'Try to set the IP
Try
IP = System.Net.IPAddress.Parse(inIP)
Catch ex As Exception
Exit Sub
End Try
'Set the port
port = inPort
initalised = startListener()
End Sub
'''''''''''''''
'' Listening ''
'''''''''''''''
Private Sub Listening()
ourListener.Start()
End Sub
'starts listener
Public Function startListener() As Boolean
ourListener = New TcpListener(IP, port)
ourClient = New TcpClient()
Dim ListenerThread As New Thread(New ThreadStart(AddressOf Listening))
ListenerThread.Start()
initalised = True
Return True
End Function
'Called from a timer on the form
Public Function tick() As Boolean
If Not initalised Then
Return False
End If
If ourListener.Pending = True Then
ourMessage = ""
ourClient = ourListener.AcceptTcpClient()
Dim Reader As New System.IO.StreamReader(ourClient.GetStream())
While Reader.Peek > -1
ourMessage = ourMessage + Convert.ToChar(Reader.Read()).ToString
End While
messagebox(ourMessage)
End If
Return True
End Function
End Class
使用这种方法,每个客户端都将侦听从服务器发送的消息,并且发送的任何消息都将转到服务器并被定向到相关的客户端-这有点低效,但对于我的软件工作方式是必要的。
问题是,我有真正的麻烦让这个工作在互联网上。如果我发送消息到本地IP地址,它工作良好,甚至从调试器。如果我使用外部IP地址,我会得到以下内容:
无法连接,因为目标机器主动拒绝了XXX.XXX.XXX.XXX:65500"
我已经用路由器打开了端口转发,并设置了正确的端口(65500)来转发到运行TCP和UDP列表(192.168.1.5)的PC。这个网站告诉我这个端口是开放的,而两边都没有。
如果我右键单击exe并以管理员身份运行,我的防病毒软件会弹出并说当我启动侦听器时它正在做一些可疑的事情(我猜如果有什么令人鼓舞的)。如果我将我的应用程序添加到异常列表中并再次运行它,然后检查端口是否正在侦听(使用此),我发现我的应用程序在正确的端口上侦听(如果我停止应用程序,它就消失了)。然而,客户端应用程序仍然给出上述相同的错误。如果我使用一个随机的IP地址,而不是一个监听器,我会得到一个不同的错误:
{"连接尝试失败,因为被连接方在一段时间后没有正确响应,或者由于连接的主机未能响应XXX.XXX.XXX.XXX:65500,已建立的连接失败"}
我怀疑我没有采取正确的方法。我对VB的大多数方面都很好,但是以前没有真正解决过这类问题。当涉及到分发软件时,我真的不希望我的客户为了让这个应用程序工作而不得不弄乱深度设置。任何帮助对我都是非常有用的!
我想我将来会面临的另一个问题是,如果多个客户端具有相同的外部IP,但内部IP不同(我打算分发给大学)。在这种情况下,我想端口转发将无法工作。
提前非常感谢(并为长帖子道歉)!
如果您将服务器设置为侦听192.168.1.5
上的连接,那么它将只允许来自特定IP地址的连接。您给TcpListener
的地址是您将接受连接的IP地址。
由于192.168.1.5
地址是内部的,没有人在你的网络之外将能够连接到你的服务器。让您的服务器听0.0.0.0
(或等效的 IPAddress.Any
),而不是让它允许来自任何人的连接。