0

私は単純な Eclipse プラグインを使用して、statechartsと呼ばれるビジュアル ステート マシンを作成してきました。これも Java コードを使用して動作します。私の全体的な目標は、2 つのステート マシンがソケットを介して相互に通信し、データを交換し、それに基づいてクライアント サーバー通信などの遷移を行うことです。最初は単純な同期クライアント サーバー コードを使用していましたが、明らかに同期アプローチを使用しても役に立ちません。正しい方法は、キューからデータを継続的にポーリングすることです。私は今Java NIO、有望と思われるものを使用しようとしていますが、残念ながら最初の試みでは成功しませんでした. 受信した値が変更をトリガーすることを許可しないビジー ループがどこかにあるようです。

コードは非常に単純です。最初にサーバーに接続し (動作します)、データを送信し (動作します)、データを受信する方法としてサイクルごとに入力バッファーから読み取ろうとします (図を参照)。ここまでのロジックは理にかなっています。受信したデータを、遷移式にもある変数に設定しました。つまり、基本的に true に設定されるたびに、次の状態に遷移する必要があります。しかし、うまくいきません。

誰かがこの問題を解決するのを手伝ってくれますか? NettyNagaのような非同期 API があるのを見てきました。

ステート マシンの視覚的なスキームを次に示します。 ここに画像の説明を入力

クライアントのコードは次のとおりです。

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient2 {
    String serverHostname = new String("127.0.0.1");
    BufferedReader stdIn;
    Socket echoSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;

    public void open(){
        System.out.println("Attemping to connect to host " + serverHostname
                + " on port 5555.");
        try {
            echoSocket = new Socket(serverHostname, 5555);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for " + "the connection to: "
                    + serverHostname);
        }
    }

    public void send(){
        String userInput = "1";
        out.println(userInput);
    }

    public String receive(){
        String result = "";
        try {
            result = in.readLine();
            if(result==null)
                return "0";
        } catch (IOException e) {
        }
        return result;
    }
}

サーバーのコードは次のとおりです。

package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer extends Thread {
    protected Socket clientSocket;

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(5555);
            System.out.println("Connection Socket Created");
            try {
                while (true) {
                    System.out.println("Waiting for Connection");
                    new EchoServer(serverSocket.accept());
                }
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.exit(1);
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port: 5555.");
            System.exit(1);
        } finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                System.err.println("Could not close port: 5555.");
                System.exit(1);
            }
        }
    }

    private EchoServer(Socket clientSoc) {
        clientSocket = clientSoc;
        start();
    }

    public void run() {
        System.out.println("New Communication Thread Started");

        try {
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
                    true);
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));

            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                System.out.println("Server: " + inputLine);
                out.println(inputLine);

                if (inputLine.equals("Bye."))
                    break;
            }

            out.close();
            in.close();
            clientSocket.close();
        } catch (IOException e) {
            System.err.println("Problem with Communication Server");
            System.exit(1);
        }
    }
}

そして、簡単にインポートできる Eclipse プロジェクト フォルダーを次に示します

4

1 に答える 1