如何在java中获得一个开放的套接字?

时间:2012-06-11 16:58:01

标签: java sockets client-server

在Java中,我如何获得一个开放的套接字?我有2个JFrame;在第一个JFrame中,我打开了Client socket的连接。在同一个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 个答案:

答案 0 :(得分: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以相同的方式访问它。

答案 1 :(得分:0)

制作client Socket static.

例如:

 static Socket client = new Socket;

As static member is for the class, 
and all objects share the same static variable, 
so the 2nd frame will have the same client socket.


Another thing you can do is to pass the object reference
of the client socket to the 2nd frame.

答案 2 :(得分:0)

您可以在两个JFrame内共享对Client套接字的引用。

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

  1. 将套接字声明为静态变量,JFrame1和JFrame2都可以访问它。
  2. 将Socket的引用传递给JFrame2
  3. 在JFrame2中,有一个这样的方法:

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

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

答案 3 :(得分:0)

您可以做的最好的事情只是做与在JFrame中显示内容有关的事情。

JFrame中不应包含套接字。我知道它可以,但它不应该。您应该在JFrame之外有一个用于业务逻辑的类。然后你的控制器对象可以生成你的JFrame和你的套接字。

想象一下:想象一下,而不是使用JFrame来编写命令行的应用程序。然后,当您创建JFrame时,让它们向该命令行应用程序发出命令。当您编写具有良好分层的程序时,您会发现这样的问题就会消失。