Java.net.Socket fecha sozinho

Olá a todos!

Tenho uma aplicação que utilizo java.net.ServerSocket e java.net.Socket para
a comunicação. Executo o método"accept()" de ServerSocket
para obter a conexão, logo depois, em outra thread determinada
comunicação acontece por meio do Socket retornado na método accept,
mas o problema é que o socket é fechado sem que eu invoque o método socket.close() e
isso acaba impossibilitando a comunicação.
O exemplo a abaixo:

O Servidor


package javaapplication;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class JavaApplication {

    public static void main(String[] args) {
        
        try{
        ServerSocket ss = new ServerSocket(3000);
        final Object blocker = new Object();
        
        while (true ){
            synchronized ( blocker ){
                try{
                    Socket socket = ss.accept();
                    final OutputStream outputStream = socket.getOutputStream();
                    final InputStream inputStream = socket.getInputStream();

                    /*Notem que abaixo estou criando um fluxo
                     * para que várias comunicações ocorram em paralelo.
                     * O problema é que quando crio fluxo e acesso o Socket
                     * o mesmo é fechado.
                     */

                    Thread th = new Thread()
                    {
                        @Override
                        public void run()
                        {
                            try{
                                while ( true ){
                                    outputStream.write(1);
                                    outputStream.flush();
                                    int intValue = inputStream.read();
                                    int i = 0;
                                }
                            }
                            catch (Exception e){
                                throw new InternalError(e.toString());
                            }
                        }
                    };

                    th.start();
                }
                catch ( Exception e ){
                    throw new InternalError(e.toString());
                }
            }
        }
        }
        catch ( Exception e ){
            javax.swing.JOptionPane.showMessageDialog(null, e.toString());
        }
    }
}

O client


package javaapplication;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class JavaApplication {

    public static void main(String[] args) {
        try{
            InetAddress address = InetAddress.getByName("notebook");
            Socket clientSocket = new Socket(address,3000);
            
            while ( true )
            {
                OutputStream outputStream = clientSocket.getOutputStream();
                InputStream inputStream = clientSocket.getInputStream();
                int intValue = inputStream.read();
                outputStream.write(2);
                outputStream.flush();
                int i = 0;
            }
        }
        catch ( Exception e ){
            throw new InternalError(e.toString());
        }
    }
}

Obrigado pela ajuda!