UNISYS Mainframe se comunicando com Java Socket [Resolvido]

8 respostas
V

Galera,

tô precisando de uma graande ajuda pois já tentei inúmeras formas para tentar estabelecer a comunicação a partir de um servidor Mainframe da Unisys. Algum de vocês já tiveram alguma experiência com este tipo de comunicação?

As tecnologias que estamos utilizando é o PortFile (partindo do Mainframe) e Java Socket - Server Socket.

Criei um socket que escuta determinada porta pela qual a comunicação deverá ser estabelecida. O Mainframe (o programa portfile) consegue conectar, porém, por algum motivo ainda desconhecido o Socket não consegue ler o que o que o Mainframe está escrevendo no Stream. Simplesmente trava a leitura.

Pensei que talvez fosse algo relacionado ao encoding. Mas não tenho certeza.

Enfim, se alguém com sua experiência conseguiu identificar algo dentro deste cenário e puder me ajudar, agradeço muito antecipamente.

8 Respostas

V

Está usando um protocolo baseado em texto ou binário?
Tem a documentação dele?
Ou pelo menos usou o wireshark na rede para ver o que está sendo transmitido?

V

ViniGodoy:
Está usando um protocolo baseado em texto ou binário?
Tem a documentação dele?
Ou pelo menos usou o wireshark na rede para ver o que está sendo transmitido?

Fala ViniGodoy,

o protocolo de comunicação é o TCP/IP. Quanto ao teste com o wireshark vamos criar um cenário para capturar a mensagem transmitida hoje, depois posso falar sobre o resultado.

O curioso é que eu consigo escrever no Stream e ele (rotina mainframe portfile) consegue recuperar, porém, quando o socket tenta ler a mensagem ele trava lançando SocketExcepton: connection reset.

É um socket simples. Ainda estamos testando a comunicação entre os dois ambientes.

public static void main(String args[]) throws Exception
	{
		PrintStream saidaRequisicao = null;
		try
		{
			/*
			 * Carregando Properties
			 */
			Properties props = new Properties();
			props.load(new FileInputStream(new File("conf/log4j.properties")));
			PropertyConfigurator.configure(props);
			if (!loadProperties())
			{
				System.exit(-1);
			}
			/*
			 * Socket responsavel pela escuta das requisicoes.
			 */
			ServerSocket s = new ServerSocket(ServerListeningText.port);
			/*
			 * Loop principal.
			 */
			while (true)
			{
				try
				{
					/*
					 * Aguardando cliente se conectar
					 */
					logger.debug(" Aguardando conexao...");
					Socket conexao = s.accept();
					logger.debug("Conectado a " + conexao.getInetAddress().getHostAddress());
					/*
					 * O servidor Mainframe consegue conectar normalmente, porém, o socket 
					 * não consegue ler a mensagem postada no Stream com o código abaixo
					 * */
					BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
					saidaRequisicao = new PrintStream(conexao.getOutputStream());
					String entradaConexao = entrada.readLine();
					logger.debug("InputStream: " + entradaConexao);
					
					logger.debug("Iniciando Escrita...");
					logger.debug("Escrevendo no buffer a mensagem '" + entradaConexao + "'");	
					saidaRequisicao.println(entradaConexao);
					Thread.sleep(2000);
					logger.debug("Fim Escrita...");
					logger.debug("Concluido!");
					entrada.close();
				}
				catch (IOException e)
				{
					/*
					 * Caso ocorra alguma excessão de E/S, mostre qual foi.
					 */
					System.out.println("IOException: " + e);
				}
				/*
				 * Thread t = new ServerListeningText(conexao); t.start();
				 */
				/*
				 * Retornando ao loop para escutar outras requisicoes
				 */
			}
		}
		catch (IOException e)
		{
			/*
			 * Caso ocorra alguma excessão de E/S, mostre qual foi.
			 */
			System.out.println("Exception: " + e);
		}
	}
V

Estou falando do protocolo de aplicação, que roda sobre o tcp/ip.

Vc está partindo do pressuposto que ele é orientado a textos (pois usa um PrintStream), mas pode ser que ele seja binário.

Sem conhecer exatamente o protocolo desse mainframe, não dá para saber como comunicar.

V

ViniGodoy:
Estou falando do protocolo de aplicação, que roda sobre o tcp/ip.

Vc está partindo do pressuposto que ele é orientado a textos (pois usa um PrintStream), mas pode ser que ele seja binário.

Sem conhecer exatamente o protocolo desse mainframe, não dá para saber como comunicar.

ViniGodoy,

vamos supor que ele seja binário. Como recuperar a informação a partir do socket?
Vou levantar as informações em relação ao protocolo da aplicação e já te falo.

Valeu cara.

V

Usando DataInputStream/OutputStream, veja um exemplo:

Mas vc precisa saber como o protocolo está organizado.

E

http://public.support.unisys.com/aseries/docs/clearpath-mcp-13.0/pdf/43103530-008.pdf

Leia a página 1-10 e 1-11. Lá ele diz que há exemplos em Java ( *SYMBOL/SOCKETS/SAMPLE/PC/JSSECLIENT ) para você falar com um programa que usa “Port File”.

A comunicação não é tão boba quanto você pensa - ela usa SSL, portanto você precisa procurar os tais programas (tanto do lado do Unisys quanto do lado do PC, ou seja, Java), e ver como é que eles estão estruturados.

Seu programa nunca vai funcionar desse jeito que você escreveu , porque você
a) Não usou os exemplos dados pelo fabricante, e
b) Não leu nenhuma documentação e tentou fazer as coisas “no grito”.

E

A propósito, minha experiência é zero com Unisys, mas o Google e a documentação do fabricante são recursos valiosos :slight_smile:

V

entanglement:
http://public.support.unisys.com/aseries/docs/clearpath-mcp-13.0/pdf/43103530-008.pdf

Leia a página 1-10 e 1-11. Lá ele diz que há exemplos em Java ( *SYMBOL/SOCKETS/SAMPLE/PC/JSSECLIENT ) para você falar com um programa que usa “Port File”.

A comunicação não é tão boba quanto você pensa - ela usa SSL, portanto você precisa procurar os tais programas (tanto do lado do Unisys quanto do lado do PC, ou seja, Java), e ver como é que eles estão estruturados.

Seu programa nunca vai funcionar desse jeito que você escreveu , porque você
a) Não usou os exemplos dados pelo fabricante, e
b) Não leu nenhuma documentação e tentou fazer as coisas “no grito”.


Caro entanglement,

primeiramente agradeço seu interesse em responder o tópico e tentar ajudar de alguma forma, porém, a sua postura crítica não foi nada boa.

Antes de abrir o tópico é óbvio que fiz a pesquisa que achei necessária, porém, sem sucesso e, por este motivo, parti em busca de pessoas que pudessem ajudar a partir deste fórum. Friso ainda que aquilo que você chamou de “grito” foi o que de fato funcionou.

Para os demais interessados, era apenas um detalhe na escrita pela rotina do Mainframe que estava causando o travamento que citei pois ao escrever a mensagem ele não estava finalizando com o caractere que indica fim de linha e que é obrigatório para o método readLine(). Me refiro ao “/n”.

Muito obrigado a todos que de alguma forma colaboraram.

Criado 27 de abril de 2013
Ultima resposta 30 de abr. de 2013
Respostas 8
Participantes 3