客户端重新连接java套接字
好的,我需要编写一个能够检测客户端和服务器之间连接的客户端…一旦服务器关闭并恢复,我的客户端需要能够将其连接回服务器…但我真的不知道如何做…如果可能,有什么帮助吗客户端重新连接java套接字,java,sockets,Java,Sockets,好的,我需要编写一个能够检测客户端和服务器之间连接的客户端…一旦服务器关闭并恢复,我的客户端需要能够将其连接回服务器…但我真的不知道如何做…如果可能,有什么帮助吗 public TEST(String serverIP, int serverPort){ Log("Connection to the Server...."); try{ socket = new Socket(serverIP, serverPort); Log("Connect
public TEST(String serverIP, int serverPort){
Log("Connection to the Server....");
try{
socket = new Socket(serverIP, serverPort);
Log("Connected to the server : "+socket);
start();
} catch(UnknownHostException uhe){
System.out.println("Unknown Host: "+ uhe.getMessage());
} catch (IOException ioe){
System.out.println("IO Exception: "+ioe.getMessage());
}
String readline = "";
streamOutput.println("TRY test");
while(true){
try{
readline = streamInput.readLine();
System.out.println(readline);
} catch (IOException ioe){
System.out.println("Error in sending: "+ioe.getMessage());
return;
}
}
}
上面是我的客户机代码,编译后用于连接到服务器…知道连接已关闭的唯一方法是尝试通过有线发送数据。连接不会自动测试打开/关闭状态。如果你想检查一个关闭的连接并重新连接,你必须从一个向另一个发送心跳信号。通常,它只是一个特殊的字节或微小的消息,告诉对方“我还在这里” 但是,根据您的应用程序,您可能不需要它。应用程序的两侧都有启动消息吗?还是RMI风格的应用程序?服务器只侦听请求的位置 也许是这样的
class Client {
private Socket socket;
private boolean tryToReconnect = true;
private final Thread heartbeatThread;
private long heartbeatDelayMillis = 5000;
public Client(final String server, final int port) {
connect(server, port);
heartbeatThread = new Thread() {
public void run() {
while (tryToReconnect) {
//send a test signal
try {
socket.getOutputStream().write(666);
sleep(heartbeatDelayMillis);
} catch (InterruptedException e) {
// You may or may not want to stop the thread here
// tryToReconnect = false;
} catch (IOException e) {
logger.warn("Server is offline");
connect(server, port);
}
}
};
};
heartbeatThread.start();
}
private void connect(String server, int port){
try {
socket = new Socket(server, port);
} catch (UnknownHostException e) {
logger.error(e, e);
} catch (IOException e) {
logger.error(e, e);
}
}
public void shutdown() {
tryToReconnect = false;
}
}
知道连接已关闭的唯一方法是尝试通过导线发送数据。连接不会自动测试打开/关闭状态。如果你想检查一个关闭的连接并重新连接,你必须从一个向另一个发送心跳信号。通常,它只是一个特殊的字节或微小的消息,告诉对方“我还在这里” 但是,根据您的应用程序,您可能不需要它。应用程序的两侧都有启动消息吗?还是RMI风格的应用程序?服务器只侦听请求的位置 也许是这样的
class Client {
private Socket socket;
private boolean tryToReconnect = true;
private final Thread heartbeatThread;
private long heartbeatDelayMillis = 5000;
public Client(final String server, final int port) {
connect(server, port);
heartbeatThread = new Thread() {
public void run() {
while (tryToReconnect) {
//send a test signal
try {
socket.getOutputStream().write(666);
sleep(heartbeatDelayMillis);
} catch (InterruptedException e) {
// You may or may not want to stop the thread here
// tryToReconnect = false;
} catch (IOException e) {
logger.warn("Server is offline");
connect(server, port);
}
}
};
};
heartbeatThread.start();
}
private void connect(String server, int port){
try {
socket = new Socket(server, port);
} catch (UnknownHostException e) {
logger.error(e, e);
} catch (IOException e) {
logger.error(e, e);
}
}
public void shutdown() {
tryToReconnect = false;
}
}
当您的客户端捕获到一个
SocketException
时,它应该进入tryToReconnect状态。现在,它每隔一段时间(例如,根据服务器的不同,1秒或更长)探测服务器。确保您实现了一些逻辑,以便在不再需要时停止该操作。当您的客户端捕获到一个SocketException
时,它应该进入tryToReconnect状态。现在,它每隔一段时间(例如,根据服务器的不同,1秒或更长)探测服务器。确保您实现了一些逻辑,以便在不再需要时停止该操作。这是一个非常常见的问题(需要知道管道何时损坏),其中一个答案是正确的,即客户端将需要(定期)检查插座,以查看其是否已关闭。服务器不会通知客户机套接字已关闭,实际上无法通知,因为它已关闭。客户端和服务器之间的防火墙、代理等在连接完成后的任何一点上都可能在一个或两个方向上终止或以其他方式阻止套接字通信
首先,如果您已经做了很多套接字编程(用“C”或Java等)。。。您将看到“尝试在断开的管道上写入”类型的错误/异常。这是一种I/O类错误,当客户机试图在关闭的套接字上写入(发送)数据时(当时检测到该套接字已关闭)
因此,答案在于管理套接字创建层之上的套接字
也就是说,客户机上的线程需要通过发送数据(定期向服务器发送“ping”以检查管道是否损坏)来监视套接字,然后在发生I/O错误时销毁(清理)并重新创建套接字(冲洗并重复)
请注意,如果客户端能够确保服务器对给定“ping”的预期一致(及时)响应,则最好使用更复杂的双向逻辑位。这将具体证实双向交通正在流动。否则,当客户端认为它仍在与服务器“对话”时,防火墙可能会在一个方向上关闭流量(该服务器可能正在接收数据,但无法传输回客户端-可能导致它在非活动超时时终止连接)。这是一个非常常见的问题(需要知道管道何时破裂),其中一个答案是正确的,说明客户将需要“检查”插座(定期)查看它是否已关闭。服务器不会通知客户端套接字已关闭,实际上无法通知,因为它已关闭。客户端和服务器之间的防火墙、代理等可能已在一个或两个方向终止或以其他方式阻止套接字通信在连接完成后的任何时候 首先,如果您做过很多套接字编程(在“C”或Java等语言中)…您将看到“尝试在断开的管道上写入”类型的错误/异常。客户端尝试在关闭的套接字上写入(发送)数据时(刚刚检测到已关闭),这是一种I/O类错误 因此,答案在于管理套接字创建层之上的套接字 也就是说,客户机上的线程需要通过发送数据(定期向服务器发送“ping”以检查管道是否损坏)来监视套接字,然后在发生I/O错误时销毁(清理)并重新创建套接字(冲洗并重复)
请注意,如果客户端能够确保预期的一致性(及时),则更复杂的双向逻辑位会更好服务器对给定“ping”的响应。这将具体确认双向流量正在流动。否则,防火墙可能会关闭单向流量,而客户端认为它仍在与服务器“交谈”(可能正在接收数据,但无法传输回客户端-可能导致客户端在非活动超时时终止连接)。您似乎不需要自己实现hear beats。它们已在大多数TCP impl中实现