3

在Java中,我怎样才能获得一个开放的套接字?我有 2 个 JFrame;在第一个 JFrame 中,我打开了客户端套接字的连接。在同一个 JFrame 中,我创建了另一个 JFrame (JFrame2) 的实例。现在我想从 JFrame1 获取相同的 Socket 到 JFrame2 以继续与我的服务器 Socket 通信:

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

请看一下Singleton的实现

有了这个,您可以从任何地方以优雅的方式访问您的对象,并保证它将被唯一地实例化。

一个遵循单例方法的简单实现:

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 之外有一个用于业务逻辑的类。然后你的控制器对象可以生成你的 JFrames 和你的套接字。

可以这样想:想象一下,您正在为命令行编写应用程序,而不是使用 JFrame。然后,当您制作 JFrame 时,让它们向该命令行应用程序发出命令。当您编写具有良好分层的程序时,您会发现这样的问题很容易解决。

于 2012-06-11T17:15:14.790 回答
0

做那个client Socket static.

例如:

 static Socket client = new Socket;

由于静态成员用于类,并且所有对象共享相同的静态变量,因此第二帧将具有相同的客户端套接字。

您可以做的另一件事是将客户端套接字的对象引用传递给第二帧。

于 2012-06-11T17:11:57.397 回答
0

您可以在两个 JFrame 中共享对客户端套接字的引用。

这可以通过以下两种方法之一实现:

  1. 将套接字声明为 JFrame1 和 JFrame2 都可以访问的静态变量。
  2. 将 Socket 的引用传递给 JFrame2

在 JFrame2 内部,有一个这样的方法:

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

然后,从 JFrame1 调用此方法,并将套接字传入。

于 2012-06-11T17:13:25.090 回答