web-dev-qa-db-ja.com

Javaソケットを備えたクライアント/サーバーアプリケーション?

別の言語(matlab)によって呼び出されるJavaパッケージを書いています。 matlabプロセスが終了した場合、Javaプロセスを実行し続けます。 matlabが再び起動するたびに、既存の実行中のプロセスと通信できるはずです。したがって、クライアント/サーバーモデルのソケットを介して通信するJavaアプリケーションが必要だと思います。私は単純な関数のセットを持つことを想定しています:

  • startServer(ホスト、ポート)
  • runCommand(server、command ...)
  • stopServer(ホスト、ポート)

私はこれまでこのようなことをしたことがありません。私はそれを正しい方法で考えていますか、それとも親のプロセスとは無関係に実行できるアプリケーションを構築する簡単な方法がありますか?これを行うための最良の現代的な方法は何ですか(たとえば、良いApacheパッケージがありますか?)誰でも簡単なデモを提供したり、ソケットを介してプロセスと通信するためのチュートリアルを教えてくれたりできますか?

[編集]明確化のために、matlabはJavaオブジェクトをインスタンス化し、それ自体でJavaコードを実行できます。そのため、matlabのstartServer()関数はJavaコードを実行し、Javaプロセスがそのポートで既に実行されているかどうかを確認し、そうでない場合はサーバープロセスを開始します。

私はソケットを使用することになんら拘束されていません(明らかでない場合、私は大部分がmatlab開発者です)。したがって、もっと簡単なものがあれば、それですべてです。 matlabから独立して実行できる必要があるだけですが、matlabがそれらのプロセスを(Javaを介して)制御します。

20
griffin

サーバーは接続をリッスンします。クライアントが接続を確立したとき。クライアントはデータを送信できます。現在の例では、クライアントは「Hi my server」というメッセージを送信します。接続を終了するために、クライアントはメッセージ「bye」を送信します。その後、サーバーはメッセージ「bye」も送信します。最後に接続が終了し、サーバーは他の接続を待ちます。 2つのプログラムは同じマシンで実行する必要があります。ただし、2つの異なるマシンでそれらを実行したい場合は、サーバーを実行するマシンのIPアドレスでアドレス「localhost」を変更するだけです。

サーバー

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

クライアント

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
Sajad Bahmani

JavaサーバープロセスがMatlabプロセスから独立している必要があるようです。Matlabプロセスが開始/停止すると、Javaサーバーが継続します。 Javaサーバーは、座って着信接続を待機し、複数の接続、切断などを処理します。

Javaソケットサーバーを書くためのチュートリアル )(Javaクライアント/サーバーソケット通信)。

直面する課題の1つは(ここではMatlabに気付かないので仕方ありません)、バイナリ表現、XML(Matlabのように見える 一部のXML機能 )またはその他。

2
Brian Agnew

カスタムソケットレベルプロトコルを使用する場合は、Java end:で JBoss Netty

つまり、Nettyは、プロトコルサーバーやクライアントなどのネットワークアプリケーションの迅速かつ簡単な開発を可能にするNIOクライアントサーバーフレームワークです。 TCPおよびUDPソケットサーバーなどのネットワークプログラミングを大幅に簡素化および合理化します。

2
skaffman

あなたが言うように、matlabがJava自体からコードを実行できる場合、 [〜#〜] rmi [を使用できない理由はないはずです。 〜#〜] matlabとJava server。RMIは、rawよりvastly簡単に通信します)ソケットプログラミング。

2
skaffman

簡単な部分はチュートリアルです: Sun's Sockets Tutorial ソケットプログラミングについて知るために必要なすべてを教えてくれました。

サポートしたいコマンド、特に最初と3番目のコマンドについての考えを明確にする必要があると思います。

  • Javaプロセスが実行されていない場合、誰がstartServerコマンドに応答しますか?そして、実行されている場合、誰がそれを必要としますか?)

  • stopServerコマンドを確実に実装できます。しかし、それは、コンピューターが自分の電源コードを壁から引き抜くようなものです。前の質問に戻ります。サーバーが停止した場合、誰が開始コマンドを聞くのでしょうか?

私が理解しているように、必要なリモート操作は中央の操作だけです。

ただし...ソケットプログラミングはやや楽しいだけです。 RMIチュートリアル を参照してください。

1
Carl Smotricz

JavaサーバーをTomcatのサーブレットのコレクションとして実装できない理由は何ですか? Tomcatには、サーバーを自動起動して実行し続けるためのすべてのツールが付属しています。SOAPサービスまたはRESTful Webサービスを非常に簡単に実装でき、matlabコードをJavaコードから切り離すのに役立ちます。

1
Suppressingfire