1

私は2つのJavaアプリケーションを持っています。1つはWebアプリで、もう1つは単純なJavaアプリです。そのため、それらの間の通信にソケットプログラミングを使用しています。

作成したスレッドであるSocketServerを1つ作成し、作成ServerSocket serverSocket = new ServerSocket(6789) したWebアプリでSocket client = new Socket("localhost", 6789); サーバーがクライアントにデータを送信し、クライアントが他の作業を開始しますが、別のクライアントを実行する場合、つまりサーバーは異なるパラメーターを送信し、クライアントは処理を開始する必要があります。どうすればよいですか?

サーバーはすでに「6789」ポートで起動されており、最初のクライアントも同じポートで起動されているためです。別のポートでクライアントを起動するにはどうすればよいですか?

サーバーを最初に起動し、次にクライアントを起動する必要があるたびに。

両方が同じポートを持つまで、クライアントはサーバーを見つけられないと思います。

別のポートで別のサーバーインスタンスを作成してからクライアントを呼び出す必要がありますか?しかし、クライアントはどのポートサーバーで起動されているかをどのように知ることができますか?

例えば:

私が次のようなUIを持っていると想像してください:

MIlindを開始します

xyzを開始します

abcを開始

strartをクリックすると、クライアントが呼び出され、プロセスが開始されます。最初にMilindを開始した場合、xyzをどのように開始しますか?'start Milind'はポート6789でクライアントとサーバーを開始したため、他の開始プロセスはどのように機能しますか?

4

2 に答える 2

4

WebアプリがローカルJavaプログラムと通信するためだけにサーバー/クライアントアプリを作成することは、多くのオーバーヘッドのように思われます(さらに、このプロセスを複製して一度に複数のことを実行することもできます)。Webアプリのバックグラウンドでの並行処理を探している場合は、いつでもスレッド(または複数のスレッド)を作成して作業を行うことができます。または、単純なJavaアプリをWebアプリに埋め込むことができない理由はありますか?

于 2012-10-03T12:59:51.070 に答える
2

ソケット接続サーバー側を受け入れるときは、スレッドを分割する必要があります。これはserversocketで非常に簡単に実行できます。非常に初歩的な(テストされていない!)実装:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

class Server {

    private ServerSocket socket;

    public Server() {
        try {
            this.socket = new ServerSocket(6789);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void go() throws IOException {
        while(true) {
            Socket sock = socket.accept();
            new Thread(new ClientSession(sock)).start();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        try {
            server.go();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    class ClientSession implements Runnable {

        private final Socket clientsocket;

        ClientSession(Socket sock) {
            this.clientsocket = sock;
        }

        @Override
        public void run() {
            //do stuff, like read from socket.
        }

    }

}

ポートを変更する必要はまったくないことに注意してください。

于 2012-10-03T13:07:33.070 に答える