【问题标题】:Robust Java Socket Programming强大的 Java 套接字编程
【发布时间】:2012-01-27 22:19:59
【问题描述】:

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

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();
        ...

socket被打开,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 相似,但处理的是服务器套接字

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    您需要能够区分第一次使用(服务器详细信息可能有误,应提示用户)和以后使用(服务器可能刚刚关闭时)。例如,您可以在用户首次输入 IP 时保存文件。

    之后,您可能想要类似的东西:一个内部循环,您可以在其中尝试连接到服务器并读取数据,但会超时。如果套接字由于网络错误而关闭,则可以使用 try-catch 块捕获。将所有这些放入一个外部循环中,以便在断开连接时重试。

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2014-08-17
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多