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が達成しようとしているものに対するより良い解決策を教えてもらえますか?
誰かが実際のデバイスでリグをセットアップしない理由を言うことは知っていますが、それらは高価であり、リグをセットアップするための予備のものにすぐにアクセスできません. そして今、私に質問が投げかけられたので、何が起こっているのかを知るしかありません! :-)