2010-07-14 18 views
19

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

2

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(); 
} 
+0

código Nuevo formato; por favor revertir si es incorrecto. – trashgod

+0

¿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

+2

Una vez que se establece la conexión, ambos lados son iguales. Por lo tanto, pueden enviar y recibir datos –

24

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.

image

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(); 
      } 
     }); 
    } 
} 
+2

Ah, eso me recuerda: este [ejemplo] relacionado (http://stackoverflow.com/a/14617650/230513) muestra cómo un servidor puede aceptar múltiples clientes. – trashgod

+1

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:/ –

+1

@ Nicolás: suelo usar ['SwingWorker'] (http://stackoverflow.com/search?tab=votes&q=user%3a230513%20swingworker%20%5bjava%5d). – trashgod

Cuestiones relacionadas