2012-04-11 17 views
5

Tengo configurado el servidor y el cliente, que es básicamente un sistema de correo electrónico de texto básico. Actualmente estoy usando PrintWriter para enviar el texto entre el servidor y el cliente. Intento crear un sistema basado en archivos adjuntos y para hacerlo estoy usando ObjectOutputStream.ObjectOutputStream y PrintWriter Conflict

private static PrintWriter output; 
private static ObjectOutputStream outStream; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 

Actualmente tengo el problema de que si intento enviar mensajes de texto a través de la PrintStream de salida, por alguna razón se añadirán caracteres adicionales al principio del texto que se envía, lo que significa que el programa no puede identificar las palabras clave que se pasa a través del impresor al cliente. El problema se detendrá si comento la creación del objeto OutStream.

¿Alguien me puede dar algún consejo para tratar de resolver este problema de conflicto?

+0

nunca debe usar '' PrintWriter' o PrintStream' menos que esté dispuesto a llamar CheckError() después de cada E/S, y luego están preparados para aguantar a los estados de error binario en lugar de excepciones. – EJP

Respuesta

4

Este texto adicional proviene del flujo de salida del objeto.

Adjuntar un ObjectOutputStream Y un PrintStream al mismo outputtream básicamente nunca va a funcionar. Tienes que encontrar una solución para usar 1 o la otra. Para usar solo PrintStream, podría considerar convertir sus objetos a JSON o XML. Por otro lado, puede usar un ObjectOutputStream y escribir sus cadenas en ObjectOutputStream

+1

Muchos intentos/capturas más tarde ... Decidí usar solo ObjectOutputStream por sí mismo. Gracias por la respuesta rápida. –

+0

¿Puede explicar por qué el uso de las dos transmisiones no puede funcionar? ¿Es debido al almacenamiento en búfer? – Kevin

0

ObjectOutputStream solo debe utilizarse como un ObjectOutputStream en ese canal. Use el PrintWriter en otro socket si realmente lo necesita.

0

Extienda su ClientHandler y sobrescriba el constructor para incluir código para manejar transferencias de archivos. Tiene dos puertos abiertos, uno para el texto y otro para las transferencias de archivos.

private static PrintWriter output; 

public ClientHandler(Socket socket) throws IOException 
{ 
    client = socket; 
    input = new Scanner(client.getInputStream()); 
    output = new PrintWriter(client.getOutputStream(), true); 
} 

private static ObjectOutputStream outStream; 

public ClientFileHandler(Socket socket) extends ClientHandler throws IOException 
{ 
    client = socket; 
    outStream = new ObjectOutputStream(client.getOutputStream()); 

} 
Cuestiones relacionadas