Foro sobre Java SE > Como Conseguir Transaccionalidad entre Sockets???
Con colgado a que te refieres? Tu puedes tener el socket todo el rato abierto, el único momento que se queda esperando es si le dices que lea del socket y no hay contenido que leer.
ok e estado trabajando en esta clase!! mi intención es ir evolucionándola para usarla en desarrollos cliente servidor:
public class socket {
java.net.ServerSocket srvSck=null;
java.net.Socket Sck = null;
java.net.SocketImpl implement;
BufferedReader entrada;
java.io.PrintWriter salida;
public String Conection(String ip, int port){
String msg="";
try {
Sck = new java.net.Socket (java.net.InetAddress.getByName(ip) , port);
msg= "Conectado con la direccion: " + ip + ":" + port + "...";
entrada = new java.io.BufferedReader(new java.io.InputStreamReader(Sck.getInputStream()));
salida = new java.io.PrintWriter(Sck.getOutputStream());
} catch (java.net.UnknownHostException e) {
javax.swing.JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
} catch (java.io.IOException e) {
javax.swing.JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
return msg;
}
public String opendPort(int port){
String msg="";
try {
srvSck = new java.net.ServerSocket(port);
Sck = srvSck.accept();
msg= "Conectado con la direccion: " + Sck.getInetAddress();
entrada = new java.io.BufferedReader(new java.io.InputStreamReader(Sck.getInputStream()));
salida = new java.io.PrintWriter(Sck.getOutputStream());
} catch (IOException e) {
javax.swing.JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
return msg;
}
public String sendData(String datos) {
salida.print(datos);
salida.flush();
return "Cliente>> " + datos;
}
public String getData(){
String datos="";
try {
datos= entrada.readLine();
} catch (java.io.IOException e) {
javax.swing.JOptionPane.showMessageDialog(null,e);
e.printStackTrace();
}
return "Servidor>>" + datos;
}
public void closeServerConection(){
try {
srvSck.close();
} catch (IOException e) {
javax.swing.JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
}
public void closeConection(){
try {
salida.close();
entrada.close();
Sck.close();
} catch (java.io.IOException e) {
javax.swing.JOptionPane.showMessageDialog(null, e);
e.printStackTrace();
}
}
}
y este es el frame cliente que e creado para provar.
lo e estado probando con un servidor echo en vb6, se conecta bien, le envio un dato y lo recive bien pero cuando el servidor me responde se cuelga el frame y hasta que no desconecte el sock del servidor no se me descuelga el frame cliente.
@SuppressWarnings("serial")
public class Cliente extends javax.swing.JFrame{
public Cliente(){
initobjs();
/*try {
javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.multi.MultiLookAndFeel");
} catch (Exception e) {}*/
}
@SuppressWarnings("static-access")
public void initobjs(){
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setResizable(false);
this.setTitle("Cliente");
text1 = new javax.swing.JTextField("101.102.103.244");
text2 = new javax.swing.JTextField("23");
text3 = new javax.swing.JTextField();
label1 = new javax.swing.JLabel("IP:");
label2 = new javax.swing.JLabel("Port:");
button1 = new javax.swing.JButton("Connect");
button2 = new javax.swing.JButton("Send");
ScrollPane1 = new javax.swing.JScrollPane();
TextPane1 = new javax.swing.JTextPane();
timer1 = new javax.swing.Timer(1000, new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
TextPane1.setText(sck.getData()); // Aqui es donde intento recibir el dato y donde se tranca el Stream
}
});
TextPane1.setEditable(false);
TextPane1.setSelectionStart(TextPane1.getText().length());
ScrollPane1.setViewportView(TextPane1);
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
button1ActionPerformed(evt);
}
});
button2.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
button2ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this.getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(10,10,10)
.addComponent(label1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(text1,100,100,100)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(label2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(text2,50,50,50)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(button1,90,90,90)
.addContainerGap(10, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(ScrollPane1,330,330,330)
.addContainerGap(10,Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(10,10,10)
.addComponent(text3,227,227,227)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(button2,90,90,90)
.addContainerGap(10, Short.MAX_VALUE)));
layout.setVerticalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addGroup(layout.createParallelGroup()
.addComponent(label1)
.addComponent(text1,20,20,20)
.addComponent(label2)
.addComponent(text2,20,20,20)
.addComponent(button1,20,20,20))
.addContainerGap(10, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(40, 40, 40)
.addComponent(ScrollPane1,150,150,150)
.addContainerGap(10,Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(200,200,200)
.addGroup(layout.createParallelGroup()
.addComponent(text3,20,20,20)
.addComponent(button2,20,20,20))
.addContainerGap(10, Short.MAX_VALUE)));
pack();
this.setLocationRelativeTo(null);
}
private void button1ActionPerformed(java.awt.event.ActionEvent evt){
TextPane1.setText(TextPane1.getText() + "\n" + sck.Conection(text1.getText(), Integer.parseInt(text2.getText())));
timer1.start();
}
private void button2ActionPerformed(java.awt.event.ActionEvent evt){
TextPane1.setText(TextPane1.getText() + "\n" + sck.sendData(text3.getText()));
}
public static void main(String []arg){
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
new Cliente().setVisible(true);
}
});
}
socket sck = new socket();
private javax.swing.JTextField text1;
private javax.swing.JTextField text2;
private javax.swing.JTextField text3;
private javax.swing.JLabel label1;
private javax.swing.JLabel label2;
private javax.swing.JButton button1;
private javax.swing.JButton button2;
private javax.swing.JScrollPane ScrollPane1;
private javax.swing.JTextPane TextPane1;
private javax.swing.Timer timer1;
}
El problema por que te quede colgado, es porque cuando le das click al botón connect , en el listener del botón, directamente esperas la entrada de datos (en el timer) así que mientras no recivas datos, la interfaz no responde porque representa que lo haces en el mismo hilo que el de la interfaz. Para solucionarlo, en el listener en lugar de poner:
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
button1ActionPerformed(evt);
}
});
pon:
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(final java.awt.event.ActionEvent evt){
new Thread(){
public void run(){
button1ActionPerformed(evt);
}
}.start();
}
});
También hay otro error en el código del socket para que envie los datos pon en el método sendData:
salida.print(datos+"\n");
Bueno estaba releyendo y mejor dicho, no es porque se envíen los datos, los datos se envían igual, el \n es porque el otro lado lo puedas leer como cadena, con bufferedreader o cualquier de estos. Ya que no devuelven lo leído hasta que no encuentran un \n
ok michas gracias en cuanto pueda probare colocar el "\n" y les notificare si me funciono!!
gracias y saludos...
saludos!! jordibr7!! probe la solucion que me distes pero desafortunadamente no me funciono!! tendrias que pegarte el codigo en eclipse para que lo pruebes y te des cuenta pero te tendria que dar el mini servidor con el que estoy haciendo pruebas q esta echo en vb6!!!
Hola beavisx! Probaste de cambiar el listener del botón connect por este como te comente?
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(final java.awt.event.ActionEvent evt){
new Thread(){
public void run(){
button1ActionPerformed(evt);
}
}.start();
}
});
Saludos!
Hola jordibr7 lamentablemente ya probé también con un hilo y nada aunque les comento!!! e investigando mas afondo me e dado cuenta de que los socket en vb6 no funcionan muy bien con los socket de java!!! ya que encontre un caso de otra persona con el mismo problema!!! saludos...
Lo que estas escribiendo es un poco raro.
Es un servidor que solo te sirve una unica conexion entrante.
Si quieres crear algo parecido a un server deberias tener el ServerSocket en un bucle de acepts y luego tratar cada Socket entrante obtenido, habitualmente en un Thread aparte para que el servidor pueda seguir trabajando.
No se muy bien porque no te lee, pero probablemente estaras haciendo algo raro en la parte que no se ve. Lo intuyo porque me parece, por lo que has escrito, auq aun vas un poco pez en esto. Sin ofender ehh!
Un saludo,
Paposo
Releyendo tus post veo que dices que estas probando con un servidor VB6.
No lo entiendo.
¿Que quieres hacer en java? ¿Un cliente o un servidor?
Lo que has escrito es un servidor un poco mal hecho.
Saludos!! e trabajado por mucho tiempo con desarrollos cliente servidor y desde hace poco tiempo e comenzado a trabajar este tema en java, me gustaría saber como logro conseguir que ambos socket mantengan la coneccion, ya que si no cierro el socket que recibe el dato que le envío el programa se queda colgado...!!!