java在错误的ip地址打开套接字
有两台后端计算机将提供相同的内容。我正在尝试创建一个循环设置和故障保护,这样,如果一个出现故障,请求应该发送给另一个 至于循环,我的代码运行得很好 对于故障保护,我尝试将一个IP更改为某个无效IP(没有运行任何服务),然后它应该连接到另一个。但它却被挂在了电话线上:java在错误的ip地址打开套接字,java,sockets,Java,Sockets,有两台后端计算机将提供相同的内容。我正在尝试创建一个循环设置和故障保护,这样,如果一个出现故障,请求应该发送给另一个 至于循环,我的代码运行得很好 对于故障保护,我尝试将一个IP更改为某个无效IP(没有运行任何服务),然后它应该连接到另一个。但它却被挂在了电话线上: client = new Socket(ip, port); 我们能为此做些什么?如果我没有在2秒钟内获得连接,我不想重试(如果java就是这么做的,我可以减少重试超时吗?) 而且,经过很长一段时间后,它抛出了IllegalSta
client = new Socket(ip, port);
我们能为此做些什么?如果我没有在2秒钟内获得连接,我不想重试(如果java就是这么做的,我可以减少重试超时吗?)
而且,经过很长一段时间后,它抛出了IllegalStateException
(我一点也没料到)
下面是我的Connect.java构造函数:
//Variable declartion
private static int balancer = 0;
private static boolean[] down = {false, false};
private static int[] countDown = {0, 0};
private static final int maxRequests = 10000;
private static int countRequests = 0;
//Constructor
public Connect() throws NullPointerException{
int use = balancer;
int flag = 0;
countRequests = (countRequests + 1) % maxRequests;
if(countRequests == 0){
down[0] = down[1] = false;
}
if((balancer == 0 && down[0] == false) || down[1] == true){
ip = Config.IP1;
port = Config.PORT1;
use = 0;
System.out.println("balancer = 0");
}
else{
ip = Config.IP2;
port = Config.PORT2;
use = 1;
System.out.println("balancer = 1");
}
LOGGER.setLevel(Level.INFO);
// Single simple socket
try {
client = new Socket(ip, port);
System.out.println("client");
dos = new DataOutputStream(client.getOutputStream());
dis = new DataInputStream(client.getInputStream());
if(client == null || dos == null || dis == null){
throw new IOException("Connection could not be opened properly\n");
}
LOGGER.log(Level.INFO, "Connection to : " + ip + " Successfully opened");
balancer = (balancer == 0) ? 1 : 0;
countDown[use] = 0;
flag = 1;
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
countDown[use] ++;
if(countDown[use] >= 3){
down[use] = true;
}
LOGGER.log(Level.SEVERE, ": " + ip + " " + e.getMessage());
}
finally{ //if connection was not opened on first
if(flag == 0){
if(use == 0){
ip = Config.IP2;
port = Config.PORT2;
use = 1;
}
else{
ip = Config.IP1;
port = Config.PORT1;
use = 0;
}
try {
client = new Socket(ip, port);
dos = new DataOutputStream(client.getOutputStream());
dis = new DataInputStream(client.getInputStream());
if(client == null || dos == null || dis == null){
throw new IOException("Connection could not be opened properly\n");
}
LOGGER.log(Level.INFO, "Connection to " + ip + " Successfully opened");
balancer = (balancer == 0) ? 1 : 0;
countDown[use] = 0;
flag = 1;
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
countDown[use] ++;
if(countDown[use] >= 3){
down[use] = true;
}
LOGGER.log(Level.SEVERE, ": " + ip + " " + e.getMessage());
throw new NullPointerException("Connection could not be opened properly on both machines\n");
}
}
}
}
我所期望的是一个
IO/NullPointer异常
,然后执行catch
块如何使用默认的Socket()
构造函数,然后,它允许您指定一个特定的超时
例如:
import java.net.*;
public class Test {
public static void main(String[] args) throws Exception {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(args[0], 80), 2000);
}
}
您可以通过计时来查看操作中的超时:
$ time java Test google.com
real 0m0.154s
user 0m0.079s
sys 0m0.022s
$ time java Test 192.168.2.123
Exception in thread "main" java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at Test.main(Test.java:5)
real 0m2.111s
user 0m0.076s
sys 0m0.026s
旁注:在连接上使用超时是合理应用程序首先拥有的唯一选项;-)你能写一个例子吗?出于好奇:除非这是为了“学习目的”;你自己实施某件事的意义是什么。。。这已经做了很多次了;这很难做到对吗?你看,你的源代码表明你是Java的绝对初学者。。。那么:你真的认为重新发明轮子是获得实践的良好开端吗?@Jägermeister,你为什么说,
很难
。这是一个简单的实现,所以考虑到我们的系统不应该有任何单点故障,我认为我应该自己做。处理多个分布式系统是不容易的。如果你的系统包含更多类似于你发布的代码;这已经是一次失败。很抱歉这么说;但这段代码太可怕了。我自己标记了这篇文章的副本…虽然我以前尝试过搜索,但似乎没有使用正确的关键字。@Jägermeister,实际上这是一个特定的场景,我们近期内不会看到更多的后端机器(可能根本不会),所以这段代码有点硬。我想知道你为什么说这段代码很糟糕(我想学习-我是初学者),或者还有什么可以改进的。如果你有时间,我们可以讨论一下。