2017-01-20 10 views
0

Мне нужно сделать оболочку мэйнфрейма, мэйнфрейм запускает Music SP, и это может быть доступ к терминалу TN3270.java runtime process exec

Я использую эмулятор терминала x3270, и мне нужно подключиться к нему в java. Я пытался со временем ява выполнения:

public void init() { 

    Process p = null; 
    byte[] buffer = new byte[2048]; 
    Scanner s = new Scanner(System.in); 

    System.out.println("> Starting server..."); 

    try { 
     // Execution of mainframe 
     p = Runtime.getRuntime().exec(
       "C:\\Program Files\\wc3270\\wc3270.exe", null); 
     // Capture I/O 
     in = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     out = new BufferedWriter(
       new OutputStreamWriter(p.getOutputStream())); 
     err = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     System.out.println("> OK!"); 
     // Connect/login/enter/tareas.c 
     System.out.println("> Connecting to Music SP..."); 
     execute("connect XXX.XXX.XXX.XXX:XXX"); 
     enter(); 
     //p.waitFor(); 
     System.out.println("> OK!"); 
     enter(); 
     //p.waitFor(); 
     System.out.println("> Login..."); 
     execute("String(login)"); 
     enter(); 
     execute("String(pass)"); 
     enter(); 
     //p.waitFor(); 
     enter(); 
     System.out.println("> OK!");  
     System.out.println("> Start tareas.c..."); 
     execute("String(tareas.c)"); 
     enter(); 
     //p.waitFor(); 
     System.out.println("> OK!");  
    } catch (Exception e) { 
     e.printStackTrace(); 
     p.destroy(); 
    } 
} 

public void execute(String query) throws IOException { 
    if (query != null) { 
     out.write(query); 
     out.flush(); 
    } 
    if (!checkOK()) { 
     System.out.println(">>> FAIL QUERY"); 
    } 
} 

public void enter() throws IOException { 
    out.write("enter"); 
    out.flush(); 
    if (!checkOK()) { 
     System.out.println(">>> FAIL ENTER"); 
    } 
} 

public boolean checkOK() { 
    try { 
     in.readLine(); 
     return in.readLine().contains("ok"); 
    } catch (Exception e) { 
     return false; 
    } 
} 

Но когда я исполняю я получаю:

> Starting server... 
OK! 
Connecting to Music SP... 
FAIL QUERY 
FAIL ENTER 
OK! 
FAIL ENTER 
Login... 
FAIL QUERY 
java.io.IOException: Stream Closed 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(Unknown Source) 
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
    at java.io.BufferedOutputStream.flush(Unknown Source) 
    at sun.nio.cs.StreamEncoder.implFlush(Unknown Source) 
    at sun.nio.cs.StreamEncoder.flush(Unknown Source) 
    at java.io.OutputStreamWriter.flush(Unknown Source) 
    at java.io.BufferedWriter.flush(Unknown Source) 
    at Connection.enter(Connection.java:86) 
    at Connection.init(Connection.java:57) 
    at Connection.<init>(Connection.java:20) 
    at Connection.main(Connection.java:102) 

Где и в чем проблема?

Другой вопрос, когда я делаю запрос, как я могу ждать, чтобы сделать другой запрос? мне нужно подождать между запросами

спасибо!

+0

выглядит, как вы можете запускать скрипты http://x3270.bgp.nu /x3270-script.html –

ответ

0

IOException может быть причиной этих:

  • Чтение сетевой файл и отсоединился.
  • Чтение локального файла, который больше не доступен.
  • Использование некоторого потока для чтения данных и другого процесса закрывает поток.
  • Попытка чтения/записи файла, но не имеет разрешения.
  • Пытается записать файл, но дисковое пространство больше не доступно.
  • Есть еще много примеров, но они наиболее распространены в моем опыте.

В вашем случае, как указано выше, поток был закрыт.

+0

но я не закрываю поток, нет? я не вижу, где проблема (в коде) – Patatas91

0

InputStreamReader (InputStream в, Струнный charsetName)

вместо использования по умолчанию набор символов, попробуйте указать его

также см Screen scraping with Java and X3270