Application client/serveur Java avec sockets?

j'écris un paquet java qui sera appelé par une autre langue (matlab). Si mon processus matlab se termine, je veux que le processus Java continue à fonctionner. Chaque fois que matlab recommence, il devrait pouvoir communiquer avec le processus existant. Je pense donc que j'ai besoin que L'application Java communique via des sockets dans un modèle client/serveur. J'envisage d'avoir un simple ensemble de fonctions:

  • startServer (host, port)
  • runCommand(serveur de, commande...)
  • stopServer (host, port)

je n'ai jamais rien fait de tel avant. Est-ce que j'y pense de la bonne façon, ou y a-t-il un moyen plus simple de construire une application qui peut fonctionner indépendamment du processus parent? Quelle est la meilleure façon moderne de faire cela (par exemple, y a un bon paquets Apache)? Quelqu'un peut-il fournir une simple démo ou m'indiquer un tutoriel sur la communication avec un processus à travers les sockets?

[Edit] pour clarifier les choses, matlab est capable d'instancier un objet java et d'exécuter du code java en lui-même. Ainsi, la fonction startServer() de matlab exécuterait du code java qui vérifierait si un processus java est déjà en cours d'exécution sur ce port et si ce n'est pas le cas, lancerait le processus serveur.

Je ne suis pas du tout lié à l'utilisation de sockets (au cas où ce ne serait pas évident, je suis surtout un développeur de matlab), donc s'il y a quelque chose de plus facile, je suis tout à fait pour. J'ai juste besoin de être capable d'exécuter des choses indépendamment de matlab, mais avoir matlab contrôle ces processus (via java).

20
demandé sur griffin 2009-11-21 22:25:46

6 réponses

le serveur écoute pour une connexion. Lorsqu'une connexion est établie par un client. Le client peut envoyer des données. Dans l'exemple actuel le client envoie le message "Salut mon serveur". Pour résilier la connexion, le client envoie le message "bye". Puis le serveur envoie le message "au revoir". Enfin, la connexion est terminée et le serveur attend une autre connexion. Les deux programmes devraient fonctionner dans la même machine. cependant, si vous voulez exécuter dans deux machines différentes, vous pouvez suffit de changer l'adresse "localhost" par l'adresse IP de l'ordinateur sur lequel vous exécutez le serveur.

Le serveur

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

le client

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();
    }
}
27
répondu Sajad Bahmani 2013-03-29 23:33:25

Si vous décidez d'aller avec un socket personnalisé protocole de niveau, alors je vous suggérons d'utiliser JBoss Netty à la java à la fin:

en d'autres termes, Netty est un client NIO le cadre du serveur qui permet de facile et développement de réseau applications telles que les serveurs de protocole et les clients. Il simplifie grandement et simplifie la programmation réseau en tant que serveur de socket TCP et UDP.

2
répondu skaffman 2009-11-21 19:33:12

il semble que vous ayez besoin du processus Java server pour être indépendant du processus Matlab. Ainsi, lorsque le processus Matlab démarre / s'arrête, le serveur Java continue. Le serveur Java va attendre les connexions entrantes et gérer plusieurs connexions, déconnexions, etc.

Voici un tutoriel pour écrire un serveur Java socket (notez que cela fait partie d'un plus grand tutoriel sur la communication client/serveur Java socket).

Une difficulté (et je can't help you here being Matlab-unknown) est de créer ou d'utiliser un moyen indépendant de la plate-forme pour créer le message réel, que ce soit en utilisant une représentation binaire, XML (on dirait que Matlab a certaines fonctionnalités XML) ou autres.

2
répondu Brian Agnew 2009-11-21 19:35:10

si, comme vous le dites, matlab peut exécuter du code java à partir de lui-même, alors il n'y a aucune raison que vous ne puissiez pas utiliser RMI pour communiquer entre matlab et java server. RMI is très plus facile que la programmation de socket brute.

2
répondu skaffman 2009-11-21 19:43:08

la partie facile est le tutoriel:Soleil fiches du Tutoriel m'a appris tout ce que j'avais besoin de savoir sur la programmation des sockets, et j'espère qu'il en sera de même pour vous.

je pense que vous avez besoin de clarifier votre pensée sur les commandes que vous souhaitez soutenir, en particulier la première et la 3ème:

  • si le processus Java ne fonctionne pas, qui va répondre à votre startServer commande? Et si elle est en cours d'exécution, qui en a besoin? :)

  • vous pouvez certainement mettre en oeuvre un stopServer la commande. Mais ce serait un peu comme avoir votre ordinateur tirant sur son cordon d'alimentation du mur. Nous revenons à la question précédente: si le serveur est arrêté, qui entendra la commande Démarrer?

d'après ce que j'ai compris, la seule opération à distance dont vous avez besoin est celle du milieu.

Toutefois... la programmation des sockets n'est que modérément amusante. Vous pouvez envisager de chercher à le RMI tutoriel pour une alternative.

1
répondu Carl Smotricz 2009-11-21 19:34:31

y a-t-il une raison pour laquelle vous ne pouvez pas simplement implémenter votre serveur java comme une collection de servlets dans tomcat? Tomcat est livré avec tous les outils pour autostart et garder le serveur en marche, vous pouvez implémenter le service SOAP ou les services web RESTful assez facilement ce qui aidera à découpler votre code matlab de votre code java.

1
répondu Suppressingfire 2009-11-21 19:37:54