Debería hacer un servidor & cliente en Java, basado en Swing y gui.Necesito hacer de alguna manera un socket que vaya desde el servidor al cliente y del cliente al servidor, y pasará algún tipo de cadena. Me gustaría tener más tarde una función que haría varias cosas de acuerdo con la cadena que estaría en el socket.
Por alguna razón no pude encontrar un ejemplo simple de código que muestre cómo se hace de una manera simple.
¿Alguien tiene un ejemplo simple o puede explicar cómo se hace?Enchufe usando en un applet oscilante
Respuesta
Un ejemplo básico sería la siguiente: (basado en tutorial de Socket Programming in Java, por A.P.Rajshekhar)
public static void main(String[] args) throws
UnknownHostException, IOException, InterruptedException {
Thread serverThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// create the server socket
ServerSocket server = new ServerSocket(
8888, 5, InetAddress.getLocalHost());
// wait until clients try to connect
Socket client = server.accept();
BufferedReader in = new BufferedReader(new
InputStreamReader(client.getInputStream()));
// loop until the connection is closed
String line;
while ((line = in.readLine()) != null) {
// output what is received
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread clientThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// connect with the server
Socket s = new Socket(InetAddress.getLocalHost(), 8888);
// attach to socket's output stream with auto flush turned on
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
// send some text
out.println("Start");
out.println("End");
// close the stream
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
// start server
serverThread.start();
// wait a bit
Thread.sleep(1000);
// start client
clientThread.start();
}
En base a esta example, aquí hay un par cliente-servidor de red simple usando Swing. Tenga en cuenta algunos problemas relacionados con la sincronización correcta: la GUI se construye en el hilo de envío del evento usando invokeLater()
. Además, el código se basa en la seguridad de subprocesos de append()
. Finalmente, incorpora una útil sugerencia del artículo Text Area Scrolling.
Actualización: En Java 7, append()
ya no está marcado como seguro para subprocesos; invokeLater()
se usa en display()
para secuenciar las actualizaciones.
package net;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.text.DefaultCaret;
/**
* A simple network client-server pair
* @http://stackoverflow.com/questions/3245805
*/
public class Echo implements ActionListener, Runnable {
private static final String HOST = "127.0.0.1";
private static final int PORT = 12345;
private final JFrame f = new JFrame();
private final JTextField tf = new JTextField(25);
private final JTextArea ta = new JTextArea(15, 25);
private final JButton send = new JButton("Send");
private volatile PrintWriter out;
private Scanner in;
private Thread thread;
private Kind kind;
public static enum Kind {
Client(100, "Trying"), Server(500, "Awaiting");
private int offset;
private String activity;
private Kind(int offset, String activity) {
this.offset = offset;
this.activity = activity;
}
}
public Echo(Kind kind) {
this.kind = kind;
f.setTitle("Echo " + kind);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getRootPane().setDefaultButton(send);
f.add(tf, BorderLayout.NORTH);
f.add(new JScrollPane(ta), BorderLayout.CENTER);
f.add(send, BorderLayout.SOUTH);
f.setLocation(kind.offset, 300);
f.pack();
send.addActionListener(this);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
DefaultCaret caret = (DefaultCaret) ta.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
display(kind.activity + HOST + " on port " + PORT);
thread = new Thread(this, kind.toString());
}
public void start() {
f.setVisible(true);
thread.start();
}
//@Override
public void actionPerformed(ActionEvent ae) {
String s = tf.getText();
if (out != null) {
out.println(s);
}
display(s);
tf.setText("");
}
//@Override
public void run() {
try {
Socket socket;
if (kind == Kind.Client) {
socket = new Socket(HOST, PORT);
} else {
ServerSocket ss = new ServerSocket(PORT);
socket = ss.accept();
}
in = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream(), true);
display("Connected");
while (true) {
display(in.nextLine());
}
} catch (Exception e) {
display(e.getMessage());
e.printStackTrace(System.err);
}
}
private void display(final String s) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
ta.append(s + "\u23CE\n");
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
new Echo(Kind.Server).start();
new Echo(Kind.Client).start();
}
});
}
}
Ah, eso me recuerda: este [ejemplo] relacionado (http://stackoverflow.com/a/14617650/230513) muestra cómo un servidor puede aceptar múltiples clientes. – trashgod
Sigo viendo código en Internet que funciona porque usa métodos Swing que resultan ser seguros para subprocesos (como setText) y no puedo encontrar un buen ejemplo de cómo tener un evento de envío de subprocesos de red en segundo plano al EDT:/ –
@ Nicolás: suelo usar ['SwingWorker'] (http://stackoverflow.com/search?tab=votes&q=user%3a230513%20swingworker%20%5bjava%5d). – trashgod
- 1. ¿Qué significa enjuagar un enchufe?
- 2. selector de tiempo oscilante
- 3. ¿Existe un componente JList filtrable oscilante?
- 4. ¿Cómo se crea un applet de Java usando JRuby?
- 5. ¿Se puede dejar de enganchar en un enchufe?
- 6. enchufe Javascript en Noty da error
- 7. Cómo abrir una nueva ventana de applet desde un applet
- 8. Excepción de captura en el hilo oscilante
- 9. Enchufe "Flush" al habilitar temporalmente NoDelay
- 10. eclipse: cómo crear un applet?
- 11. Applet usando JNLP: mensajes en la consola Java
- 12. Java Applet no en caché
- 13. ¿Cómo firmo un applet de Java usando un certificado en mi llavero Mac?
- 14. C# ¿Verifica si el enchufe está desconectado?
- 15. Detectar cuando se carga un Applet
- 16. Fondo degradado predeterminado del componente oscilante
- 17. Applet Web service client, con Eclipse Indigo usando Apache CXF,
- 18. ¿Cómo implementar Applet con dependencias jar usando maven y firmarlo?
- 19. Exportación .jar Applet en Eclipse
- 20. Eliminar componente oscilante mediante validar o revalidar
- 21. Java - java.lang.UnsupportedClassVersionError en el applet
- 22. ¿Cómo saber si mi componente Java está en un Applet?
- 23. ¿Es posible crear un applet web JavaFX?
- 24. Ejecutando un applet de java desde netbeans?
- 25. cargando clases Java desde un applet firmado
- 26. ¿cómo puedo ejecutar un applet como aplicación?
- 27. Applet: Java heap space
- 28. Java Applet Permissions
- 29. ¿Puedo verificar si un certificado de applet de Java es confiable antes de ejecutar mi applet?
- 30. Silenciar el sonido en Java Applet
código Nuevo formato; por favor revertir si es incorrecto. – trashgod
¿Pero es posible transferir datos desde ambos lados? Como ServerSocket no tiene una función que sea igual a la que tiene el cliente, como s.getOutputStream(), ¿cómo se hace? Lo que quiero decir es que necesito tener una conversación que sea básica en lo que escribiste, ¿pero cómo el servidor te devolvería la respuesta? – Inbal
Una vez que se establece la conexión, ambos lados son iguales. Por lo tanto, pueden enviar y recibir datos –