3

Javaでは、オープンソケットを取得するにはどうすればよいですか? 2 つの JFrame があります。最初の JFrame で、クライアント ソケットの接続を開きます。この同じ JFrame 内に、別の JFrame (JFrame2) のインスタンスを作成します。ここで、JFrame1 から JFrame2 に同じソケットを取得して、サーバーのソケットとの通信を続けたいと考えています。

login.java (最初の JFrame)

try {
            cliente = new Socket("localhost", 4444);
            salida = new ObjectOutputStream(cliente.getOutputStream());
            entrada = new ObjectInputStream(cliente.getInputStream());
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: localhost.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: localhost.");
            System.exit(1);
        }

login.java (最初の Jframe)

try {           

            while ((mensaje_entrada=(String)entrada.readObject()) != null) {
                try {
                    me=td.encrypt(mensaje_entrada);
                    m2=td.decrypt(me);
                } catch (Exception ex) {
                    Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
                }
                System.out.println("e:"+ me);
                System.out.println("de:"+ m2);

                System.out.println(mensaje_entrada);
                if(mensaje_entrada.equals("20")){
                    mensaje_salida=""+txt_usuario.getText()+","+txt_password.getText();
                    System.out.println(mensaje_salida);
                    salida.writeObject( mensaje_salida );
                    salida.flush();
                    mensaje_entrada=(String)entrada.readObject();
                    System.out.println(mensaje_entrada);
                    if(mensaje_entrada.equals("1")){
                        m.setLocationRelativeTo(null); <---- **m is another JFrame(Jframe2)**
                        m.setVisible(true);
                        //JOptionPane.showMessageDialog(this,"Funciona!!");
                        break;
                    }else if(mensaje_entrada.equals("2")){
                        JOptionPane.showMessageDialog(this,"Usuario o contraseña incorrecta!","Error!",JOptionPane.ERROR_MESSAGE);
                        break;
                    }
                }

            }

        } catch (EOFException ex) { //This exception will be caught when EOF is reached
            System.out.println("End of file reached.");    
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(this,ex.getMessage());
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this,ex.getMessage());
        }
4

4 に答える 4

2

シングルトンの実装を見てください

これにより、どこからでもエレガントな方法でオブジェクトにアクセスでき、一意にインスタンス化されることが保証されます。

それに対するシングルトンのアプローチに従う簡単な実装:

package foo.bar;

import java.io.IOException;
import java.net.Socket;

public final class MySingletonSocket extends Socket {

    private static Socket clientSocket;

    static {
        try {
            clientSocket = new MySingletonSocket("localhost", 4444);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private MySingletonSocket(final String address, final int port) throws IOException {
        super(address, port);
    }

    public static final Socket getInstance() {
        return clientSocket;
    }

}

JFrame1 から次のようにアクセスできます。

MySingletonSocket.getInstance()

JFrame2 からも同様にアクセスできます。

于 2012-06-11T17:20:39.537 に答える
1

あなたができる最善のことは、JFrame での表示に関係することだけを行うことです。

JFrame にソケットを含めることはできません。私はそれができることを知っていますが、すべきではありません。ビジネス ロジック用に JFrame の外部にクラスを用意する必要があります。その後、コントローラー オブジェクトは、JFrame とソケットの両方を生成できます。

次のように考えてください。JFrame を使用する代わりに、コマンド ライン用のアプリケーションを作成していると想像してください。次に、JFrame を作成するときに、そのコマンド ライン アプリケーションにコマンドを発行させます。このような問題は、適切な階層化を使用してプログラムを作成すると、簡単に解消されることがわかります。

于 2012-06-11T17:15:14.790 に答える
0

両方の JFrame 内で Client ソケットへの参照を共有できます。

これは、次の 2 つの方法のいずれかで可能です。

  1. JFrame1 と JFrame2 の両方からアクセスできる静的変数としてソケットを宣言します。
  2. ソケットの参照を JFrame2 に渡します

JFrame2 内には、次のようなメソッドがあります。

public void setSocket(Socket s) {
    this.socket = s;
}

次に、JFrame1 からこのメソッドを呼び出し、ソケットを渡します。

于 2012-06-11T17:13:25.090 に答える
0

それを作るclient Socket static.

例えば:

 static Socket client = new Socket;

静的メンバーはクラス用であり、すべてのオブジェクトが同じ静的変数を共有するため、2 番目のフレームには同じクライアント ソケットがあります。

もう 1 つの方法は、クライアント ソケットのオブジェクト参照を 2 番目のフレームに渡すことです。

于 2012-06-11T17:11:57.397 に答える