write socket multiple mkyong library clients java sockets client-server

multiple - ¿Aplicación de cliente/servidor Java con sockets?



socket java ip (6)

¿Alguna razón por la que no puedes simplemente implementar tu servidor de Java como una colección de servlets en tomcat? Tomcat viene con todas las herramientas para iniciar automáticamente y mantener el servidor en funcionamiento, puede implementar el servicio SOAP o servicios web RESTful con bastante facilidad lo que ayudará a desacoplar su código de matlab de su código java.

Estoy escribiendo un paquete de Java que será llamado por otro idioma (matlab). Si mi proceso de matlab finaliza, quiero que el proceso de Java siga en ejecución. Cada vez que Matlab comienza de nuevo, debería poder comunicarse con el proceso de ejecución existente. Entonces, creo que necesito que la aplicación Java se comunique a través de sockets en un modelo cliente / servidor. Me imagino tener un conjunto simple de funciones:

  • startServer (host, puerto)
  • runCommand (servidor, comando ...)
  • stopServer (host, puerto)

Nunca he hecho nada como esto antes. ¿Estoy pensando en ello de la manera correcta, o existe una manera más fácil de crear una aplicación que pueda ejecutarse independientemente del proceso de sus padres? ¿Cuál es la mejor manera moderna de hacer esto (por ejemplo, hay buenos paquetes de Apache)? ¿Alguien puede proporcionar una demostración simple o señalarme un tutorial sobre la comunicación con un proceso a través de sockets?

[Editar] Para una aclaración, matlab es capaz de instanciar un objeto java y ejecutar código java dentro de sí mismo. Entonces, la función startServer () en matlab ejecutaría un código java que verificará si un proceso java ya se está ejecutando en ese puerto y, de no ser así, iniciará el proceso del servidor.

No estoy vinculado al uso de sockets de ninguna manera (en caso de que no sea obvio, soy principalmente un desarrollador de matlab), así que si hay algo más fácil, estoy de acuerdo. Solo necesito poder ejecutar cosas independientemente de Matlab, pero tengo control de matlab en esos procesos (a través de Java).


La parte fácil es el tutorial: Sun''s Sockets Tutorial me enseñó todo lo que necesitaba saber sobre la programación de sockets, y espero que también lo haga por usted.

Creo que debes aclarar tus ideas sobre los comandos que quieres apoyar, en particular el primero y el tercero:

  • Si el proceso de Java no se está ejecutando, ¿quién va a responder a su comando startServer ? Y si se está ejecutando, ¿quién lo necesita? :)

  • Ciertamente puede implementar un comando stopServer . Pero eso sería como tener tu computadora sacando su propio cable de alimentación de la pared. Volvemos a la pregunta anterior: si el servidor está parado, ¿quién escuchará el comando de inicio?

Según entiendo, la única operación remota que necesitas es la del medio.

Sin embargo ... la programación de socket es moderadamente divertida. Puede considerar consultar el tutorial de RMI para obtener una alternativa.


Parece que necesita que el proceso del servidor Java sea independiente del proceso Matlab. Entonces, cuando el proceso de Matlab comienza / se detiene, el servidor Java continúa. El servidor Java se sentará y esperará las conexiones entrantes, y manejará múltiples conexiones, desconexiones, etc.

Aquí hay un tutorial para escribir un servidor de socket Java (tenga en cuenta que es parte de un tutorial más grande sobre comunicación de socket cliente / servidor Java).

Uno de los desafíos que enfrentará (y no puedo ayudarlo siendo Matlab-inconsciente) es crear o utilizar un medio independiente de la plataforma para crear el mensaje real, ya sea usando una representación binaria, XML (parece que Matlab tiene alguna funcionalidad XML) ) u otro.


Si decide ir con un protocolo de nivel de socket personalizado, entonces puedo sugerirle que use JBoss Netty en el extremo de java:

En otras palabras, Netty es un marco de servidor de cliente NIO que permite el desarrollo rápido y fácil de aplicaciones de red tales como servidores de protocolo y clientes. Simplifica y optimiza en gran medida la programación de red, como el servidor de socket TCP y UDP.


Si, como dices, matlab puede ejecutar código java desde dentro de sí mismo, entonces no debería haber ninguna razón para que no puedas usar RMI para comunicarte entre el servidor de Java y el servidor de Java. RMI es mucho más fácil que la programación de socket sin procesar.


El servidor escucha por una conexión. Cuando una conexión es establecida por un cliente. El cliente puede enviar datos. En el ejemplo actual, el cliente envía el mensaje "Hola mi servidor". Para finalizar la conexión, el cliente envía el mensaje "bye". Luego, el servidor envía el mensaje "bye" también. Finalmente, la conexión finaliza y el servidor espera otra conexión. Los dos programas deberían estar ejecutándose en la misma máquina. sin embargo, si desea ejecutarlos en dos máquinas diferentes, puede simplemente cambiar la dirección "localhost" por la dirección IP de la máquina donde ejecutará el servidor.

El servidor

import java.io.*; import java.net.*; public class Provider{ ServerSocket providerSocket; Socket connection = null; ObjectOutputStream out; ObjectInputStream in; String message; Provider(){} void run() { try{ //1. creating a server socket providerSocket = new ServerSocket(2004, 10); //2. Wait for connection System.out.println("Waiting for connection"); connection = providerSocket.accept(); System.out.println("Connection received from " + connection.getInetAddress().getHostName()); //3. get Input and Output streams out = new ObjectOutputStream(connection.getOutputStream()); out.flush(); in = new ObjectInputStream(connection.getInputStream()); sendMessage("Connection successful"); //4. The two parts communicate via the input and output streams do{ try{ message = (String)in.readObject(); System.out.println("client>" + message); if (message.equals("bye")) sendMessage("bye"); } catch(ClassNotFoundException classnot){ System.err.println("Data received in unknown format"); } }while(!message.equals("bye")); } catch(IOException ioException){ ioException.printStackTrace(); } finally{ //4: Closing connection try{ in.close(); out.close(); providerSocket.close(); } catch(IOException ioException){ ioException.printStackTrace(); } } } void sendMessage(String msg) { try{ out.writeObject(msg); out.flush(); System.out.println("server>" + msg); } catch(IOException ioException){ ioException.printStackTrace(); } } public static void main(String args[]) { Provider server = new Provider(); while(true){ server.run(); } } }

El cliente

import java.io.*; import java.net.*; public class Requester{ Socket requestSocket; ObjectOutputStream out; ObjectInputStream in; String message; Requester(){} void run() { try{ //1. creating a socket to connect to the server requestSocket = new Socket("localhost", 2004); System.out.println("Connected to localhost in port 2004"); //2. get Input and Output streams out = new ObjectOutputStream(requestSocket.getOutputStream()); out.flush(); in = new ObjectInputStream(requestSocket.getInputStream()); //3: Communicating with the server do{ try{ message = (String)in.readObject(); System.out.println("server>" + message); sendMessage("Hi my server"); message = "bye"; sendMessage(message); } catch(ClassNotFoundException classNot){ System.err.println("data received in unknown format"); } }while(!message.equals("bye")); } catch(UnknownHostException unknownHost){ System.err.println("You are trying to connect to an unknown host!"); } catch(IOException ioException){ ioException.printStackTrace(); } finally{ //4: Closing connection try{ in.close(); out.close(); requestSocket.close(); } catch(IOException ioException){ ioException.printStackTrace(); } } } void sendMessage(String msg) { try{ out.writeObject(msg); out.flush(); System.out.println("client>" + msg); } catch(IOException ioException){ ioException.printStackTrace(); } } public static void main(String args[]) { Requester client = new Requester(); client.run(); } }