Sockets

Hola les pido su ayuda para realizar lo siguente

Deseo hacer una comunicacion cliente servidor que mas o menos quede asi

cliente ---> te voy a enviar un objeto
servidor <--- enviamelo
cliente ----> envia el objeto
servidor <---- confirma que llego
cliente ---> manda algun comando para cerrar el socket o manda mas comandos

entonces se enviaria algo de texto y despues se enviaria un objeto, puedo hacer que se envie texto o un objecto pero no los dos. si alguien ya lo a hecho me servivira de mucha ayuda

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de skuarch

Este es una parte del codigo

package network;

import beans.Message;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import util.IOUtilities;
import util.SocketUtilities;

/**
 *
 * @author skuarch
 */

public class SocketProcessor implements Runnable {

    static final Logger logger = Logger.getLogger(SocketProcessor.class);
    private Socket socket = null;
    private PrintWriter printWriter = null;
    private BufferedReader bufferedReader = null;
    private InputStream inputStream = null;
    private OutputStream outputStream = null;
    private ObjectInputStream objectInputStream = null;
    private ObjectOutputStream objectOutputStream = null;
    private String input = null;
    private boolean flag;

    //==========================================================================
    public SocketProcessor(Socket socket) {
        PropertyConfigurator.configure("log.properties");
        this.socket = socket;
    } // end SocketProcessor

    //==========================================================================
    @Override
    public void run() {

        try {            

            logger.info("attending client " + socket.getRemoteSocketAddress());

            outputStream = socket.getOutputStream();
            inputStream = socket.getInputStream();
            printWriter = new PrintWriter(outputStream, true);
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            println(banner());
            println("cmd: ");
           
            while ((input = bufferedReader.readLine()) != null) {

                logger.info("command: " + input);

                handlerCommand(input);

                if (!flag) {
                    break;
                }

                input = null;
               
                println("cmd: ");

            }

        } catch (Exception e) {
            logger.error("ERROR: SocketProcessor().run() ", e);
        } finally {
            SocketUtilities.closeSocket(socket);
        }

    } // end run

    //==========================================================================
    private String banner() {

        String banner = "**********************************\n\r"
                + "This is a Sniffer Message Server\n\r"
                + "**********************************\n\r";
        flag = true;

        return banner;
    } // end banner

    //==========================================================================
    private void println(String line) {
        try {

            printWriter.println(line + "\r");
            printWriter.flush();
            outputStream.flush();

        } catch (Exception e) {
            logger.error("ERROR: SocketProcessor().println() ", e);
        }
    } // end println

    //==========================================================================
    private void shutDown() {
        println("the server will be shutdown");
        disconnectClient();
        System.exit(0);
    } // end shutDown

    //==========================================================================
    private void disconnectClient() {
        logger.info("disconnecting client");
        println("Connection closed with client, bye !!");
        SocketUtilities.closeSocket(socket);
        IOUtilities.closeBufferdReader(bufferedReader);
        flag = false;
    } // enc closeConnection

    //==========================================================================
    private Object object() {

        Object object = null;

        try {
                         
            logger.info("receiving object ");            
            objectInputStream = new ObjectInputStream(inputStream);
            object = objectInputStream.readObject();

            flag = true;

        } catch (Exception e) {
            logger.error("ERROR: SocketProcessor().object() ", e);
            disconnectClient();
        } finally {
            IOUtilities.closeObjectInputStream(objectInputStream);            
        }

        if (object == null) {
            logger.error("ERROR: SocketProcessor().object() returning null");
        } else {
            handlerObject(object);
        }

        return object;

    } // end object

    //==========================================================================
    private void handlerObject(Object object) {

        try {

            if (object instanceof Message) {
                Message m = (Message) object;
                logger.info("se recivio un message " + m.getType());
            }

        } catch (Exception e) {
            logger.error("ERROR: SocketProcessor().handlerObject() ", e);
        }

    } // end handlerObject

    //==========================================================================
    private void handlerCommand(String command) {

        try {

            //------------------------------------------------------------------
            if (command.equalsIgnoreCase("exit")) {

                disconnectClient();

            } //----------------------------------------------------------------
            else if (command.equalsIgnoreCase("shutDownServer")) {

                shutDown();

               
            } //----------------------------------------------------------------
            else if (command.equalsIgnoreCase("ssn")) {

                new Thread(new SSN(this.socket)).start();

            } //----------------------------------------------------------------
            else if (command.equalsIgnoreCase("")) {

                println("command is empty");
                disconnectClient();

            } //----------------------------------------------------------------
            else if (command.contains("object")) {
               
                object();

            } //----------------------------------------------------------------            
            else if (command.contains("info")) {

                println("hostname: " + InetAddress.getLocalHost().getHostName());

            } //----------------------------------------------------------------
            else {

                println("command " + command + " not found");
                disconnectClient();

            }

        } catch (Exception e) {
            logger.error("ERROR: SocketProcessor().handlerCommand() ", e);
        }

    } // end handlerCommand
} // end class

Imagen de skuarch

El error

cuando envio texto todo sale de maravilla pero cuando mando el comando object marca esta excepcion

13:41:11,625 ERROR SocketProcessor:135 - ERROR: SocketProcessor().object()
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.(ObjectInputStream.java:279)
at network.SocketProcessor.object(SocketProcessor.java:129)
at network.SocketProcessor.handlerCommand(SocketProcessor.java:197)
at network.SocketProcessor.run(SocketProcessor.java:61)
at java.lang.Thread.run(Thread.java:662)