在Java中,如何获得开放的套接字?我有2个JFrame;在第一个JFrame中,我打开客户端套接字的连接。在同一JFrame中,我创建另一个JFrame(JFrame2)的实例。现在,我想将相同的Socket从JFrame1插入JFrame2,以继续与服务器Socket通信:
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);
}
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());
}
请看一下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,您可以以相同的方式访问它。
您可以在两个JFrame中共享对Client套接字的引用。
这可以通过以下两种方法之一进行:
在JFrame2内部,有这样的方法:
public void setSocket(Socket s) {
this.socket = s;
}
然后,从JFrame1调用此方法,并将套接字传递进来。
您能做的最好的事情就是只做与在JFrame中显示内容有关的事情。
一个JFrame不应该有一个套接字。我知道可以,但是不可以。您应该在JFrame之外有一个用于业务逻辑的类。然后,您的控制器对象可以同时生成JFrame和套接字。
这样想:想象您不是在使用JFrame而是在为命令行编写应用程序。然后,当您制作JFrame时,让它们向该命令行应用程序发出命令。当您编写具有良好分层的程序时,就会发现像这样的问题就消失了。
设为client Socket static.
例如:
static Socket client = new Socket;
由于静态成员是该类的成员,并且所有对象共享相同的静态变量,因此第二帧将具有相同的客户端套接字。
您可以做的另一件事是传递对象引用客户端套接字连接到第二帧。