socket servidor recibir hilos fuente enviar entre datos con comunicacion computadoras codigo cliente arquitectura java multithreading sockets

servidor - comunicacion entre dos computadoras java



Enviando un mensaje a todos los clientes(comunicaciĆ³n Cliente-Servidor) (3)

Echa un vistazo a zeroMQ. Existen métodos conocidos como "pub sub" o "publicar suscripción" que harán lo que usted desee. También puede usarlo para comunicarse entre sus hilos. Es una biblioteca increíble en mi opinión. Tiene enlaces Java o jzmq junto con más de 30 o más, así que deberías poder usarlo en tu programa.

http://www.zeromq.org/

Así que ahora, estoy haciendo una aplicación de servidor de cliente basada en multiproceso. En el lado del servidor, hago un hilo para una conexión única que sea aceptada.

En la clase de subprocesos, hago un método que envía un comando al cliente. Lo que quiero es simplemente, ¿cómo enviar un parámetro a todos los clientes en ejecución? Para una declaración simple, solo quiero hacer que este servidor envíe un mensaje a todos los clientes conectados.

Me han leído esta publicación y encuentro el sendToAll(String message) desde este enlace . Pero cuando intento con mi código, no hay un método como este en ServerSocket .

De acuerdo, este es mi código de muestra para el servidor y el hilo.

class ServerOne{ ServerSocket server = null; ... ServerOne(int port){ System.out.println("Starting server on port "+port); try{ server = new ServerSocket(port); System.out.println("Server started successfully and now waiting for client"); } catch (IOException e) { System.out.println("Could not listen on port "+port); System.exit(-1); } } public void listenSocket(){ while(true){ ClientWorker w; try{ w = new ClientWorker(server.accept()); Thread t = new Thread(w); t.start(); } catch (IOException e) { System.out.println("Accept failed: 4444"); System.exit(-1); } } } protected void finalize(){ try{ server.close(); } catch (IOException e) { System.out.println("Could not close socket"); System.exit(-1); } } } class ClientWorker implements Runnable{ Socket client; ClientWorker(Socket client){ this.client = client; } public void run(){ ... sendCommand(parameter); ... } public void sendCommand(String command){ PrintWriter out = null; try { out = new PrintWriter(client.getOutputStream(), true); out.println(command); } catch (IOException ex) {} } }

Gracias por la ayuda :)


No hay ningún método en el socket del servidor para enviar datos o mensajes a todos los subprocesos de clinet en ejecución. Por favor, vaya a través del programa ServerThread.java que llama al servidor sendToAll sendToAll.

// ... and have the server send it to all clients server.sendToAll( message );


La respuesta a continuación no se recomienda para un servidor completo, ya que para esto debe usar Java EE con servlets, servicios web, etc.

Esto solo se pretende cuando unas pocas computadoras quieren conectarse para realizar una tarea específica, y el uso de sockets Java simples no es un problema general. Piense en la informática distribuida o los juegos multijugador.

EDITAR: he actualizado desde el primer momento esta arquitectura, ahora probada y protegida contra subprocesos. Cualquiera que lo necesite puede descargarlo aquí .

Simplemente use (directamente, o subclasificando) Server and Client , start() them, y todo estará listo. Lee los comentarios en línea para obtener opciones más potentes.

Si bien la comunicación entre clientes es bastante complicada, intentaré simplificarla, lo más posible.

Aquí están los puntos, en el servidor:

  • Mantener una lista de clientes conectados.
  • Definiendo un hilo, para la entrada del servidor.
  • Definiendo una cola de los mensajes recibidos.
  • Una encuesta de hilos de la cola y trabajar con ella.
  • Algunos métodos de utilidad para enviar mensajes.

Y para el cliente:

  • Definiendo un hilo, para la entrada del cliente.
  • Definiendo una cola de los mensajes recibidos.
  • Una encuesta de hilos de la cola y trabajar con ella.

Aquí está la clase de Servidor:

public class Server { private ArrayList<ConnectionToClient> clientList; private LinkedBlockingQueue<Object> messages; private ServerSocket serverSocket; public Server(int port) { clientList = new ArrayList<ConnectionToClient>(); messages = new LinkedBlockingQueue<Object>(); serverSocket = new ServerSocket(port); Thread accept = new Thread() { public void run(){ while(true){ try{ Socket s = serverSocket.accept(); clientList.add(new ConnectionToClient(s)); } catch(IOException e){ e.printStackTrace(); } } } }; accept.setDaemon(true); accept.start(); Thread messageHandling = new Thread() { public void run(){ while(true){ try{ Object message = messages.take(); // Do some handling here... System.out.println("Message Received: " + message); } catch(InterruptedException e){ } } } }; messageHandling.setDaemon(true); messageHandling.start(); } private class ConnectionToClient { ObjectInputStream in; ObjectOutputStream out; Socket socket; ConnectionToClient(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread(){ public void run(){ while(true){ try{ Object obj = in.readObject(); messages.put(obj); } catch(IOException e){ e.printStackTrace(); } } } }; read.setDaemon(true); // terminate when main ends read.start(); } public void write(Object obj) { try{ out.writeObject(obj); } catch(IOException e){ e.printStackTrace(); } } } public void sendToOne(int index, Object message)throws IndexOutOfBoundsException { clientList.get(index).write(message); } public void sendToAll(Object message){ for(ConnectionToClient client : clientList) client.write(message); } }

Y aquí para la clase de Cliente:

public class Client { private ConnectionToServer server; private LinkedBlockingQueue<Object> messages; private Socket socket; public Client(String IPAddress, int port) throws IOException{ socket = new Socket(IPAddress, port); messages = new LinkedBlokingQueue<Object>(); server = new ConnecionToServer(socket); Thread messageHandling = new Thread() { public void run(){ while(true){ try{ Object message = messages.take(); // Do some handling here... System.out.println("Message Received: " + message); } catch(InterruptedException e){ } } } }; messageHandling.setDaemon(true); messageHandling.start(); } private class ConnectionToServer { ObjectInputStream in; ObjectOutputStream out; Socket socket; ConnectionToServer(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread(){ public void run(){ while(true){ try{ Object obj = in.readObject(); messages.put(obj); } catch(IOException e){ e.printStackTrace(); } } } }; read.setDaemon(true); read.start(); } private void write(Object obj) { try{ out.writeObject(obj); } catch(IOException e){ e.printStackTrace(); } } } public void send(Object obj) { server.write(obj); } }