Search code examples
javasocketsserversocketobjectoutputstreamobjectinputstream

Socket ObjectOutpuStream ObjectInputStream


I'm writing simple client - server application. Everything is ok but when i change InputStream and OutputStream to ObjectOutputStream and ObjectInputStream my application doesn't send the messages. Can anyone help me and show me the problem ?

Here is the Serwer.java:

class InWorke implements Runnable{

    BufferedReader odczyt=null;
    String slowo;
    ObjectInputStream ois=null;
    Message message;

    InWorke(ObjectInputStream ois) {
        this.ois=ois;
    }

    public void run() {
        while(true) {
            try {
                slowo = (String) ois.readObject();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(slowo);
            Thread.yield();
        }               }

}

class OutWorke implements Runnable{
    Socket socket=null;
    BufferedReader odczytWe=null;
    DataOutputStream zapis=null;
    String slowo=null;
    Message message; // it is the simple class to serialization
    ObjectOutputStream oos;

    OutWorke(Socket socket,ObjectOutputStream oos) {
        this.socket=socket;
        this.oos=oos;
    }

    public void run() {
        while(true) {
            odczytWe=new BufferedReader(new InputStreamReader(System.in));
            try {
                slowo=odczytWe.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                    oos.writeObject(slowo);
                    oos.flush();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            Thread.yield();

    }

}
}

public class Klient {
    public static void main(String[] args) {

    Socket socket=null;
    ExecutorService exec=Executors.newCachedThreadPool();

    ObjectOutputStream oos=null;
    ObjectInputStream ois=null;

    try {
        socket=new Socket("localhost", 8881);
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        //we=socket.getInputStream();
        ois=new ObjectInputStream(socket.getInputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        //wy=socket.getOutputStream();
        oos=new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    exec.execute(new OutWorke(socket, oos));
    exec.execute(new InWorke(ois));

 }
} 

Klient.java:

class InWorker implements Runnable{

    Socket socket=null;
    //InputStream we=null;
    //OutputStream wy=null;
    String slowo=null;
    BufferedReader odczyt=null;
    ObjectOutputStream oos;
    ObjectInputStream ois;
    Message message=null;

    InWorker(Socket socket,ObjectInputStream ois) {
        this.socket=socket;
        this.ois=ois;
    }

    public void run() {
                while(true) {
                try {
                    slowo=(String) ois.readObject();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(slowo);
                Thread.yield();
            }

            }
}

class OutWorker implements Runnable{

    DataOutputStream zapis=null;
    BufferedReader odczyt=null;
    //OutputStream wy=null;
    String tekst=null;
    ObjectOutputStream oos=null;
    Message message;

    OutWorker(ObjectOutputStream oos) {
        this.oos=oos;
    }

    public void run() {
        while(true) {
        odczyt=new BufferedReader(new InputStreamReader(System.in));
        try {
            tekst=odczyt.readLine();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            oos.writeObject(tekst);
            oos.flush();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Thread.yield();
        }
    }

}

public class Serwer {

    public static void main(String[] args) {
        ServerSocket serversocket=null;
        Socket socket=null;
        //InputStream we=null;
        //OutputStream wy=null;
        ObjectOutputStream oos=null;
        ObjectInputStream ois=null;

        ExecutorService exec=Executors.newCachedThreadPool();

        try {
            serversocket=new ServerSocket(8881);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            socket=serversocket.accept();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            ois=new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            oos=new ObjectOutputStream(socket.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        exec.execute(new InWorker(socket, ois));
        exec.execute(new OutWorker(oos));

    }

}

Solution

  • Check constructor of ObjectInputStream: constructor.
    It says:

    This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.

    So you need to create and flush corresponding ObjectOutputStream. Now you are creating ObjectInputStreams before output stream for both server and client. They block programs because no output stream is created. You should create output streams first, call flush on them and only then create input streams.