强大的Java套接字编程

时间:2012-01-27 22:19:59

标签: java sockets

我的客户端应用程序需要能够在几种情况下恢复。 打开电源后,客户端从文件中读取地址和端口,并尝试连接到服务器。 如果这是第一次在此主机上使用此客户端,则会尝试使用默认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();
        ...

打开套接字,设置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 个答案:

答案 0 :(得分:1)

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

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

根据细节,假设数据量很小,您的客户端每次都可以轻松打开连接,而不是尝试维护连接,然后在连接之间休眠。

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