Perry, devo dizer que é um ótimo trabalho esse que você desenvolveu (e continua desenvolvendo). Muito obrigado.
Perguntas todas sobre java:
1 - Só a versão 4.2.0 que possui plugin java mais recente?
2 - consegui instanciar um 'terminal' e conectar porém quando tenta pegar o conteúdo só mostra um vazio host.getScreenContent() ...
System.out.println("Conexão :" + host.isConnected() + "\nConteudo" + host.getScreenContent());
Resultado -> "Conexão :true
Conteudo "
3 - Em qual diretório devo colocar a classe teste.java pro pw3270 executar?
4 - Tem algum método do tipo setVisible() pra mostrar o pw3270 sendo executado? caso não tenha pensei em fazer um swing e atualizar a tela com getScreenContent() mas não seria muito bom pro tempo de execução.
Grato
Autor: Lucas Viana Knochenhauer
3434 comentários
Dependendo do tempo entre a conexão e a leitura pode ser que a tela ainda não tenha chegado; uma possível solução é usar obj.waitForTerminalReady(segundos) para esperar um tempo ou testar se isTerminalReady() retornou true.
Você se refere ao teste.class gerado depois da compilação não? Na verdade ele pode estar em qualquer lugar onde a jvm consiga encontrá-lo porém, para executar dentro do emulador você precisa criar um .xml associando uma opção de menu qualquer à sua classe.
Se você está rodando em modo stand-alone não, porém, quando chamada por uma opção de menu a janela principal aparece normalmente.
Agora estou com um novo problema: temos como saber quando o host responde a uma ação enviada pelo programa? Por exemplo, quando em envio um sendEnterKey eu tenho três altenativas: 1. O host não respondeu no tempo determinado (A tela permanece a mesma);
2. O host respondeu, mas a tela apresentada não corresponde à tela esperada;
3. O host respondeu e a tela apresentada corresponde à tela esperada; Aparentemente o envio de uma ação (EnterKey ou PfKey) não modifica o conteúdo da tela, até que se chame algum método que provoque a sua atualização (queryStringAt(), por exemplo). Se usarmos o método waitForStringAt(), mesmo que o host responda antes do timeout o programa obrigatoriamente aguardará até o término do timeout provocando uma execução bastante lenta da aplicação. Também tentei utilizar o retorno dos métodos, mas aparentemente eles retornam o mesmo valor independentemente de a operação ser bem sucedida ou não. Grato, Marcelo.
System.out.println();
System.out.println(host.getScreenContent());
int timeout = 0;
int counter = 0;
System.out.println("host.sendEnterKey() -> "+host.sendEnterKey());
System.err.println("host.isTerminalReady() -> "+host.isTerminalReady());
while( ! host.isTerminalReady() ){
host.waitForTerminalReady(10);
System.out.println("counter -> "+counter++);
}
System.out.println("host.isTerminalReady() -> "+host.isTerminalReady());
synchronized(this){
Thread.sleep(3000);
}
System.out.println(host.getScreenContent());
if(host.getScreenContentAt(13, 2, 6).equals("Código")){
System.err.println("Encontrou -> "+host.getScreenContentAt(13, 2, 6));
} else {
System.err.println("Não Encontrou -> "+host.getScreenContentAt(13, 2, 6));
} Produz a saída: 4.2 2174
Terminal .....: T2XARSAZ MSG10
IP da Estação.: 10.45.113.42
Base .........: B2B-BS2X
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| |||||||||| ||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
SISTEMA DE INFORMACOES BANCO DO BRASIL
Tecle ENTER
===> SISBB
host.sendEnterKey() -> 0
host.isTerminalReady() -> false
counter -> 0
host.isTerminalReady() -> true
Não Encontrou ->
host.waitForStringAt(1, 2, "COEPC001", timeout) -> -1238
65220676 78CORREIOma de Informações Banco do Brasil
T2XARSAZ BBBB B
BBBBBBBB BBB
25/03/2013 BBBBBBBBBBBB BBBBB
17:00:57 BBBBBBBBBBBBBBBB BBBBBBB
BBBBBBBBB BBBBBBBB BBBBBBBBB
BBBBBBBBB BBBBBBBB BBBBBBB
BBBBBBBBB BBBBBBBB BB
Digite o codigo BBBBBBBBB BBBBBBBB
BBBBBBBBB BBB BBBBBBBB
BBBBBBBBBBBBBB BBBBBBB BBBBBBBB
BBBBBBBBBBBBBBBBBBB BBBBBBBBBBB BBBBBBBB
Código de Usuário: BBBBBBBBBBBBBBB BBBBBBBBBBB BBBBBBBB
Senha : BBBBBBBBBBB BBBBBBBBBBB BBBBBBBB
Aplicativo : BBBBBBB BBBBBBBBBBB BBBBBBBB
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
F3 Comunicados F5 Encerra host.waitForStringAt(15, 2, "a", timeout) -> -1238
Terminal .....: T2XARSAZ MSG10
IP da Estação.: 10.45.113.42
Base .........: B2B-BS2X
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| |||||||||| ||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
SISTEMA DE INFORMACOES BANCO DO BRASIL
Tecle ENTER
===> SISBB
true
Terminal .....: T2XARSAZ MSG05
IP da Estação.: 10.45.113.42
Base .........: B2B-BS2X
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| |||||||||| ||||||||||
|||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| ||||
||||||||||| |||| ||||||||||| ||||||||||| |||||||||||
SISTEMA DE INFORMACOES BANCO DO BRASIL
Comando invalido. Digite SISBB
===> SISBB
Tempo Decorrido -> 5 segundos
host.getConnectionState().................... 0
{ if( host.queryStringAt(1,2,"BB30")) { // E uma tela de logon, atuo de acordo } else if(host.queryStringAt(1,2,"COEPC001")) { // TELA COEPC001, atuo de acordo } (...) else { popup("Tela desconhecida") } }
referem-se a um trecho de código que não incluí aqui e estão fora desse contexto; o que eu quis ilustrar foi
que aparentemente a chamada "host.waitForTerminalReady(10)" dentro do loop while retorna tão logo o
host.isTerminalReady() retorne "true", não necessariamente aguardando os 10 segundos passados como argumento; e que
host.isTerminalReady() retorna "true" mas a tela está em branco (uma string em branco, com 1944 posições (24*80 mais os
caracteres LF)). Vide os comandos e suas respectivas saídas: COMANDO SAÍDA
1. System.out.println("host.sendEnterKey() -> "+host.sendEnterKey()); host.sendEnterKey() -> 0
2. System.err.println("host.isTerminalReady() -> "+host.isTerminalReady()); host.isTerminalReady() -> false
3. while( ! host.isTerminalReady() ){
4. host.waitForTerminalReady(10);
5. System.out.println("counter -> "+counter++); counter -> 0 (só passou uma vez pelo loop)
6. }
7. System.out.println("host.isTerminalReady() -> "+host.isTerminalReady()); host.isTerminalReady() -> true
8. System.out.println(host.getScreenContent()); string em branco com 1944 posições (vide telas acima) Na linha 8 acima, entendo que a tela que deveria estar disponível seria a tela de login (que é a proxima tela na
sequencia natural), uma vez que o método isTerminalReady() já retornou "true". Mas o que nós temos é uma tela vazia,
onde se eu for checar se determinada string está na tela o retorno será sempre falso conforme mostrado na saída a seguir: COMANDO SAÍDA
if(host.getScreenContentAt(13, 2, 6).equals("Código")){
System.err.println("Encontrou -> "+host.getScreenContentAt(13, 2, 6));
} else {
System.err.println("Não Encontrou -> "+host.getScreenContentAt(13, 2, 6)); Não Encontrou ->
} A pergunta é: teria como host.isTerminalReady() só retornar "true" quando a tela estiver devidamente atualizada?
ou (segundo me parece) nós temos que invocar algum método que provoque a atualização antes de consultarmos determinada
string na tela? Grato, Marcelo.