在测试我的Client-Server程序时,我在尝试连接到不同路由器上的服务器时遇到了一个奇怪的异常:
连接尝试失败,因为连接方在一段时间后未正确响应,或已建立的连接失败,因为连接的主机未能响应。
在本地网络中,客户端可以很好地连接到服务器,但是当它在internet上时,它就无法工作了。
我将端口转发到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 "";
}发布于 2011-03-19 13:37:55
确保您的服务器IP地址为public,除非无法访问。
检查此link中是否有私有地址空间。
发布于 2011-03-19 12:07:41
您打开了服务器或客户端路由器上的端口1250?需要在服务器路由器上打开它。您可能需要确保服务器已连接到DMZ端口和/或在服务器路由器上启用了DMZ。
希望这能有所帮助。
发布于 2011-03-20 07:44:58
我解决了这个问题。
我使用的IP地址是从ipconfig获得的内部ip地址,但我需要使用的IP地址是从http://www.whatsmyip.org/等服务获得的外部IP地址。
我仍然不明白为什么这两个数字是不同的。
https://stackoverflow.com/questions/5359802
复制相似问题