在测试我的Client-Server程序时,我在尝试连接到不同路由器上的服务器时遇到了一个奇怪的异常:
“连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败。”
客户端可以在本地网络中完美地连接到服务器,但是当它通过互联网时它不起作用。
我端口转发端口1250(我正在使用的端口),并使用SimplePortForwarding(http://www.simpleportforwarding.com/)我验证了端口是打开并正常工作的。
我的实现基于本教程: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/
知道出了什么问题吗? 谢谢!
这是服务器监听方法:
public void startListening(int port)
{
lock(_locker)
{
_listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// Bind socket to local endpoint, and listen for incoming connections
IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, port);
_listeningSocket.Bind(ipEndpoint);
_listeningSocket.Listen(10);
waitForNewClient();
// successfully started listening
_isListening = true;
} catch (SocketException e)
{
// failed for some strange reason
_isListening = false;
}
}
}
这是客户端连接代码:
public String connect(String ipAddress, int port)
{
lock(_locker)
{
if (!_connecting)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);
try
{
_socket.Connect(endpoint);
_connected = true;
waitForData();
_eventManager.queueEvent(new PlayerJoinedEvent(PlayerJoinedEvent.PLAYER_JOINED, name));
} catch (SocketException e)
{
// Exception is thrown HERE
return e.Message;
}
}
}
return "";
}
答案 0 :(得分:0)
您在服务器或客户端路由器上打开了端口1250?它需要在服务器路由器上打开。您可能需要确保服务器已连接到DMZ端口和/或在服务器路由器上启用了DMZ。
希望这有帮助。
答案 1 :(得分:0)
答案 2 :(得分:0)
我解决了这个问题。
我使用的IP地址是我从ipconfig获得的内部IP地址,但我需要使用的IP地址是外部地址,即从http://www.whatsmyip.org/等服务获得的IP地址。
我仍然对为什么这两个数字不同感到困惑。