2012-01-27 70 views
0

我的客户端应用程序需要能够在几种情况下恢复。 打开电源时,客户端从文件读取地址和端口并尝试连接到服务器。 如果这是第一次在此主机上使用此客户端,则尝试使用默认IP地址,但这可能不正确。 用户然后需要输入正确的IP地址。该端口是硬编码的。 现在的工作方式是一秒钟的swing.Timer尝试获取服务器的状态...强大的Java Socket编程

statusTimer = new Timer(ONE_SECOND, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     final byte GET_STATUS = 20; 
     SendCommand(GET_STATUS, null); 
    } 
}); 
statusTimer.start(); 

如果没有连接用户被要求连接...

private void SendCommand(byte command, byte[] parameters) { 
    if ((null == socket) || (null == outputStream) || socket.isClosed()) 
     if (JOptionPane.YES_OPTION == 
      JOptionPane.showConfirmDialog(null, "Connect?")) 
      Connect(); 
      ... 

private void Connect() { 
    String s = (String) 
     JOptionPane.showInputDialog(null, "Enter IP Address", ipAddress); 
    if (validateIp(s)) { 
     ipAddress = s; 
     connectTask = new ConnectTask(); 
     connectTask.start(); 
     ... 

打开套接字,设置io流并启动RxThread。

class ConnectTask extends Thread { 
    @Override public void run() { 
     try { 
      if (null == socket) socket = new Socket(ipAddress, TCP_PORT); 
      if (null == outputStream) outputStream = socket.getOutputStream(); 
      if (null == inputStream) inputStream = socket.getInputStream(); 
      if (null == rxThread) rxThread = new RxThread(); 
      ... 

有一些不好的事情会发生在这一点上,例如:
1.当客户端已开启的服务器可能会关闭。客户端自动打开套接字,设置io流并在服务器启动时继续运行的最佳方式是什么?
2.以同样的方式,服务器可能在读取,写入或两者都不会看到电源循环。电源恢复后是否有自动恢复的好方法?
3.如上所述,可能需要更正IP地址。
这将是很好的处理这些和其他情况,而不需要用户关闭和打开客户端应用程序或电源循环系统。 防弹java客户端套接字需要哪种方法?
Thisthis类似,但与服务器的套接字协议

回答

1

你需要能够首次使用(当服务器的详细信息可能是错误的,应提示用户),后来使用之间的区别(当服务器可能正在关闭)。例如,您可以在用户第一次输入IP时保存文件。

之后,您可能需要如下内容:您尝试连接到服务器并读取数据的内部循环,超时。如果套接字由于网络错误而关闭,则可以使用try-catch块来捕获该套接字。把所有这些放到一个外部循环中,以便在断开连接时再次尝试。

根据具体情况,假设数据量很小,您的客户端可能最容易每次打开连接,而不是尝试维持连接,然后在连接之间休眠。

如果服务器没有响应,您当前的代码(每秒使用一个Timer创建一个新的ConnectTask线程)可能最终会创建多个ConnectTasks,每秒创建一个,每个尝试并行连接,尽管很难某些来自您发布的部分代码。