Conexion TCP/IP en java, AYUDA!!

Ergue Vittoriano
28 de Julio del 2003
Amigos tengo este programita que consegui por ahi en un tutorial pero al ejecutarlo no funciona bien, tengo el SDK 1.4.2, y mi maquina es w2k server. El programa consiste en crear una conexion a un servidor SMTP y enviar un email mediante los comandos del server, pero al parecer no esta escribiendo en el buffer de salida porque el servidor solo me devuelve el texto que sale a la entrada, osea que si se esta conectando al servidor, pero no le puedo enviar nada; ya se que se queda colgado en la instruccion while, pero es porque no esta enviando bytes a la conexion; que estoy haciendo mal?? (ayuda por favor), lo que quiero es un programa que establesca una conexion a traves de un puerto TCP y que pueda enviar y recibir, acepto sugerencias no importa lo pequeña que sea, solo que funcione la conexion en dos vias. de antemano gracias...

import java.net.*;
import java.io.*;

class smtpCliente {
public static void main( String args[] ) {
Socket s = null;
DataInputStream sIn = null;
DataOutputStream sOut = null;

// Abrimos una conexión con breogan en el puerto 25
// que es el correspondiente al protocolo smtp, e intentamos
// abrir los streams de entrada y salida
try {
s = new Socket( "mail.cantv.net",25 );
sIn = new DataInputStream( s.getInputStream() );
sOut = new DataOutputStream( s.getOutputStream() );
} catch( UnknownHostException e ) {
System.out.println( "No conozco el host" );
} catch( IOException e ) {
System.out.println( e );
}

// Si todo está inicializado correctamente, vamos a escribir
// algunos datos en el canal de salida que se ha establecido
// con el puerto del protocolo smtp del servidor
if( s != null && sIn != null && sOut != null )
{
try {
// Tenemos que respetar la especificación SMTP dada en
// RFC1822/3, de forma que lo que va en mayúsculas
// antes de los dos puntos tiene un significado especial
// en el protocolo
sOut.writeBytes( "MAIL From: [email protected]" );
sOut.writeBytes( "RCPT To: [email protected]" );
sOut.writeBytes( "DATAn" );
sOut.writeBytes( "From: [email protected]" );
sOut.writeBytes( "Subject: Pruebasn" );
// Ahora el cuerpo del mensaje
sOut.writeBytes( "Hola, desde el Tutorial de Javan" );
sOut.writeBytes( "n.n" );

// Nos quedamos a la espera de recibir el "Ok" del
// servidor para saber que ha recibido el mensaje
// correctamente, momento en el cual cortamos
String respuesta;
while( ( respuesta = sIn.readLine() ) != null )
{
System.out.println( "Servidor: "+respuesta );
if( respuesta.indexOf( "Ok" ) != -1 )
break;
}

// Cerramos todo lo que hemos abierto
sOut.close();
sIn.close();
s.close();
} catch( UnknownHostException e ) {
System.out.println( "Intentando conectar: "+e );
} catch( IOException e ) {
System.out.println( e );
}
}
}
}

hector cadavid
28 de Julio del 2003
Revisando su código, y deacuerdo a mi experiencia programando clientes de protocolos sincrónicos de servicios, su problema es que no esta realizando correctamente el protocolo. Por lo general, uno debe primero hacer el rol de cliente de forma manual desde un cliente telnet, (telnet smtserver 25), si lo hace asi se dara cuenta que uno debe comenzar haciendo un HELO, esperar la respuesta, luego hacer un un mail from (que normalmente es: mail from:<[email protected]>) y esperar una respuesta, y así sucesivamente hasta que complete el envio de correo. Teniendo en cuenta esto, usted no puede hacer sucesivamente el envio de las solicitudes MAIL,RCPT, DATA, despues de cada una de estas, debe esperar la respuesta del servidor, es decir leer del stream de entrada (no despues de haberlas hecho todas!), lo que también le serviría para generar excepciones en caso de que el servidor le retorne códigos de error.


sOut.writeBytes( "MAIL From: [email protected]\n" );
respuesta=sIn.readLine();
//verificar respuesta y continuar con la siguiente instrucción
sOut.writeBytes( "RCPT To: [email protected]\n" );
...