-1

私はここで仕事をしていますが、最終決定することができず、どのテクノロジーが問題を解決するのかわかりません。これが私の問題の説明です。私のアプリケーションはスタンドアロン アプリケーションであり、さまざまな場所にデプロイされます。LocA、LocB などとしましょう。各場所には独自のクライアントがあり、一部のクライアントは LAN 経由で接続され、一部のクライアントはサード パーティのクライアントです。クライアントが LAN 経由で接続されている限り、要求と応答の問題はありません。ただし、LAN 経由で接続されていないクライアントはほとんどありません。

サードパーティのクライアントには、IP と PORT を提供して接続し、標準の HL7 形式でデータを要求します。ここでの問題は、クライアントが任意のテクノロジを使用して独自のクライアント プログラムを作成できることです。ソケット プログラミング、.NET ソケット プログラミングなどを使用する場合があります。しかし、私たちのサーバーは、テクノロジーが何であれ、クライアントからの接続を受け入れ、要求を処理し、応答する必要があります。要件は、サーバー プログラムが常に実行され、割り当てられたポートをリッスンするか、特定のポートへの要求があるたびにサーバー プログラムを起動し、クライアントの要求を処理してクライアントに応答することです。

私の英語があなたを混乱させたら、私を許してください。私の問題の解決策を教えてください。

注 : クライアント プログラムは、任意のテクノロジおよび任意のプログラミング言語にすることができます。サーバーに接続してリクエストを送信するためにどの方法を使用するかは、クライアント次第です。

4

3 に答える 3

1

ここでは、クライアントとサーバーがソケットでどのように機能するかという小さな例を示しています。サーバー側のマルチスレッドも含めています。

クライアント側のコード:

public class ClientWala {

    public static void main(String[] args) throws Exception{

        Boolean b = true;
    Socket s = new Socket("127.0.0.1", 4444);

    System.out.println("connected: "+s.isConnected());


    OutputStream output = s.getOutputStream();
    PrintWriter pw = new PrintWriter(output,true);

    // to write data to server
    while(b){

        if (!b){

             System.exit(0);
        }

        else {
            pw.write(new Scanner(System.in).nextLine());
        }
    }


    // to read data from server
    InputStream input   = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(input);
    BufferedReader br = new BufferedReader(isr);
    String data = null;

    while ((data = br.readLine())!=null){

        // Print it using sysout, or do whatever you want with the incoming data from server

    }




    }
}

サーバー側のコード:

import java.io.*
import java.net.*;


public class ServerTest {

    ServerSocket s;

    public void go() {

        try {
            s = new ServerSocket(44457);

            while (true) {

                Socket incoming = s.accept();
                Thread t = new Thread(new MyCon(incoming));
                t.start();
            }
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    class MyCon implements Runnable {

        Socket incoming;

        public MyCon(Socket incoming) {

            this.incoming = incoming;
        }

        @Override
        public void run() {

            try {
                PrintWriter pw = new PrintWriter(incoming.getOutputStream(),
                        true);
                InputStreamReader isr = new InputStreamReader(
                        incoming.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String inp = null;

                boolean isDone = true;

                System.out.println("TYPE : BYE");
                System.out.println();
                while (isDone && ((inp = br.readLine()) != null)) {

                    System.out.println(inp);
                    if (inp.trim().equals("BYE")) {
                        System.out
                                .println("THANKS FOR CONNECTING...Bye for now");
                        isDone = false;
                        s.close();
                    }

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                try {
                    s.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

        }

    }

    public static void main(String[] args) {

        new ServerTest().go();

    }

}
于 2012-06-26T03:02:29.770 に答える
1

クライアントとサーバーの間で渡されるシリアル化されたオブジェクトで TCP ソケット接続を使用します。そうしないと、転送される情報が翻訳で失われます。このメソッドを使用して、クライアントに要件 (シリアル化されたオブジェクト) を提供し、プログラムが相互に通信できるようにする必要があります。(Java からの) ソケット接続を使用すると、ポートで着信 TCP 接続を受け入れることができます。

ここに私が言及していることの良い考えがあります

try
    {
        socket = new ServerSocket(portnum);
    }
    catch (IOException ioe)
    {
        output.append("IOException getting server socket\n" + ioe + "\n");
        return;
    }
    while (true)
    {
        try
        {
            client = socket.accept();
            output.append("Connected to client at " + client.getInetAddress());
            clientHandler(client);
        }
        catch (IOException ioe)
        {
            output.append("IOException during accept \n " + ioe + "\n");
            return;
        }
    }   

これにより、ポート「portnum」で任意の TCP 接続要求が取得されます。

アプリケーションがマルチスレッド化されていることを確認してください。そうしないと、接続が既に確立されている間は接続要求を受け入れることができなくなります。

于 2012-06-26T02:11:00.310 に答える
0

HL7 について言及したように、おそらく HAPI (http://hl7api.sourceforge.net/)を確認する必要があります。これには、メッセージの送受信に関するこの例を含む広範なドキュメントが付属しています。

HL7 の実装に互換性がある限り、クライアント プログラムがどのテクノロジを使用してもかまわないことに注意してください。また、127.0.0.1 (localhost アドレス) が常に利用できるため、ソケットは LAN なしで問題なく動作します。

于 2012-06-26T02:21:54.097 に答える