1


TCP/IP サーバーとして機能する有線デバイス用のシミュレーターを作成しようとしています。
このサーバーに接続して通信するVB6プログラムがありますが、これは断続的に失敗し、何が問題なのかを判断する必要があるため、サーバーをシミュレートするプログラムを作成しています。
VB プログラムからの接続をリッスンし、サーバー デバイスと同じ情報で応答する次の Java プログラムを作成しました。

public class ServerSim {

public static void main(String[] args){
    int port = 23;
    System.out.println("[Listening for Connection]");
    try{
        ServerSocket ss;
        ss = new ServerSocket(port);
        Socket s;

        // The program will wait here until a connection is made.
        s = ss.accept();

        // Print what client we're connected to.
        String client;
        client = s.getInetAddress().toString();
        String localPort = Integer.toString(s.getLocalPort());
        String portNo = Integer.toString(s.getPort());

        System.out.println("[Connected to "+client +"] Port:" + portNo + " localPort: " + localPort);

        //Set up Scanner / Writer to read / write data to client.
        Scanner in;
        //Scanner sc = new Scanner(System.in);

        in = new Scanner(s.getInputStream());
        PrintWriter out;
        out = new PrintWriter(s.getOutputStream(),true);

        PrintWriter log = openWriter("Log.txt");

        // Establish a 5second connection
        s.setSoTimeout(5000);

        try{
            boolean result = establishConnection(in, out);
            String input = in.nextLine();
            System.out.println("Recieved: " + input);
            String response = input;
            out.println(response);
            System.out.println("Responded: " + response);
            log.println(input + "->" + response);
       }
       catch(Exception e){
           System.err.println("EXC: "+e.getMessage());                   
           e.printStackTrace();                   
       }
       System.out.println("[Closing Connections]");
       in.close();
        out.close();
        log.close();
        s.close();
        ss.close();

    }catch(Exception e){
        e.printStackTrace();            
    }        
}
    private static boolean establishConnection(Scanner in, PrintWriter out){
        // we have a connnection - Start by outputtinga  welcome message.       
        out.print("Welcome Session 0\r\n");
        out.flush();            
        out.print("User:\r\n");
        out.flush();
        System.out.println("[Welcome sent - Waiting Response]");
        String input = in.nextLine(); // Recieve the first line.  Should be a User
        System.out.println("[Recieved '"+input+"' - Sending anticipated reply]");
        out.println("Password:");
        input = in.nextLine(); // Recieve the first line.  Should be a User
        System.out.println("[Recieved '"+input+"' - Sending anticipated reply]");
        out.println("User Logged in");      
        return true;
    }
   private static PrintWriter openWriter(String name){
        try{
            File file = new File(name);
            PrintWriter out = new PrintWriter(
                    new BufferedWriter(
                    new FileWriter(file, true)),true);
            return out;
        }
        catch(IOException e){
            System.out.println("I/O Error");
            System.exit(0);
        }
        return null;
    }

}

問題は、VB 1プログラムが私のプログラムからの入力を受け入れないことです。

成功したデバイスのネットワーク パケット キャプチャと、自分のプログラムからのトラフィックのキャプチャを比較しましたが、関連するものはすべて同じです...応答ポートを除いて。
私のプログラムでは、serversocket が VB6 プログラムへの応答用のポートをランダムに割り当てますが、シミュレートしようとしている物理デバイスに VB6 プログラムが接続されている場合、デバイスはポート 1602 でのみ応答します。

私の質問は、接続のためにポート 23 をリッスンしているときに (問題なく発生しています)、2000 から 3000 マークをランダムにジャンプするのではなく、ポート 1602 で応答するように作成されたソケットを取得するにはどうすればよいですか?

私が見ることができるすべての返信と質問は、接続を待っているポートをロックせずに、ソケットまたはマルチスレッドに関するものです。
これがうまくいかない場合、UIが達成しようとしているものに対するより良い解決策を教えてもらえますか?
誰かが実際のデバイスでリグをセットアップしない理由を言うことは知っていますが、それらは高価であり、リグをセットアップするための予備のものにすぐにアクセスできません. そして今、私に質問が投げかけられたので、何が起こっているのかを知るしかありません! :-)

1 編集: 一連の ActiveX を使用してデバイスと通信し、プロトコルを処理しているため、VB プログラムに問い合わせることができません。これは、私が見つけようとしている問題が発生している可能性があるため、書きたくありません。

4

3 に答える 3

0

java.net.Socket を試してみてください。指定されたポートで実行されているサーバーをシミュレートするために使用したコードのスニペットを提供しています。お役に立てれば幸いです。...

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 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-21T19:06:33.427 に答える
0

ポート 1602 で vb-app に応答したい場合 (および vb-app がその側でポート 1602 をまだ利用していない場合)、別の (新しい) ソケットが必要になります。

ServerSocket.accept();

を返しますjava.net.Socket。この接続は、client-port、client-ip、server-port、server-ip の 4 つの属性によって識別されます。

(あなたが呼ぶもの)応答ポートをランダムに割り当てるのはサーバー(あなたのプログラム)ではなく、クライアント(vb-app)です。クライアントがそれを行わない場合、サーバーは応答パケットをどこに配信する必要があるかわかりません。

java.net.Socketvb アプリの ip とポート 1602を使用して を作成することをお勧めします。 vb-app がクライアントおよびサーバーとして機能する可能性が非常に高くなります。

于 2012-06-21T15:19:56.163 に答える
0

「サーバーソケットは、応答用のポートをランダムに割り当てます」.

私はその声明を理解していません。Socketによって受け入れられた には、23のServerSocketローカル ポート番号 (ServerSocketがリッスンしているポートと同じ) と、接続時にクライアントによって決定されたリモート ポート番号があります。これは、サーバー プログラムの制御下にはありません。デバイスはポート 1602 のみを発信ポートとして使用する可能性がありますが、VB プログラムはほぼ確実にオペレーティング システムにポート番号を決定させます。

この情報に基づいて、観察結果を再分析する必要があると思います。

于 2012-06-22T00:28:47.347 に答える