请教,ObjectOutputStream写入到网络中报错!

我使用ObjectOutputStream从客户端写入对象到网络中,在服务器端读取对象,
然后保存到文件中。但是当我把对象写入到网络中时,出现异常。
client.java

 public class Client<M> {

    public void add(M m) {//向远程网络中存储对象
        Socket socket;
        ObjectOutputStream oos = null;
        try {
            try{
                socket = new Socket("127.0.0.1", 8011);
                OutputStream os = socket.getOutputStream();
                oos = new ObjectOutputStream(os);
                oos.writeObject(m);
                oos.flush();
            }finally {
                if(oos!=null){
                    oos.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

}

Server.java

 public class Server {
    public static void main(String[] args) {
        new Server().startServer();
    }
    public void startServer(){
        ServerSocket ss;
        ServerThread st;
        try {
            ss = new ServerSocket(8011);
            while(true){
                System.out.println("服务已经开启");
                Socket socket = ss.accept();
                st = new ServerThread(socket);//创建线程对象
                ExecutorService es = Executors.newCachedThreadPool();
                es.execute(st); //开启线程
                es.shutdown();
                socket.close();//关闭socket
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

线程
ServerThread.java

 public class ServerThread implements Runnable{
    private Socket socket;
    //private ObjectOutputStream oos = new ObjectOutputStream();
    private FileOutputStream fos;
    private ObjectInputStream ois;
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            ois = new ObjectInputStream(is);
            Object obj = ois.readObject();//读取网络中的对象

            System.out.println(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(ois!=null)
                    ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

错误如下:

 通过客户端向服务器写入对象
java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.flush(Unknown Source)
    at java.io.ObjectOutputStream.flush(Unknown Source)
    at java.io.ObjectOutputStream.close(Unknown Source)
    at com.fan.client.Client.add(Client.java:21)
    at com.fan.bean.BaseStore.save(BaseStore.java:22)
    at com.fan.execute.StudentExecute.studentExecute(StudentExecute.java:32)
    at com.fan.execute.StuSelectionCourseSys.startview(StuSelectionCourseSys.java:32)
    at com.fan.test.Test.main(Test.java:11)

希望同志们能给予我解答,十分感谢!!!!

在你的server这个类中 你主动关闭了socket 导致socket is colsed

 public function output(Response $response, array $log = [])
    {
        $request     = Request::instance();
        $contentType = $response->getHeader('Content-Type');
        $accept      = $request->header('accept');
        if (strpos($accept, 'application/json') === 0 || $request->isAjax()) {
            return false;
        } elseif (!empty($contentType) && strpos($contentType, 'html') === false) {
            return false;
        }
        // 获取基本信息
        $runtime = number_format(microtime(true) - THINK_START_TIME, 10);
        $reqs    = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞';
        $mem     = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2);

        if (isset($_SERVER['HTTP_HOST'])) {
            $uri = $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        } else {
            $uri = 'cmd:' . implode(' ', $_SERVER['argv']);
        }

        // 页面Trace信息
        $base = [
            '请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $uri,
            '运行时间' => number_format($runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()),
            '查询信息' => Db::$queryTimes . ' queries ' . Db::$executeTimes . ' writes ',
            '缓存信息' => Cache::$readTimes . ' reads,' . Cache::$writeTimes . ' writes',
            '配置加载' => count(Config::get()),
        ];

        if (session_id()) {
            $base['会话信息'] = 'SESSION_ID=' . session_id();
        }

        $info = Debug::getFile(true);

        // 页面Trace信息
        $trace = [];
        foreach ($this->config['trace_tabs'] as $name => $title) {
            $name = strtolower($name);
            switch ($name) {
                case 'base': // 基本信息
                    $trace[$title] = $base;
                    break;
                case 'file': // 文件信息
                    $trace[$title] = $info;
                    break;
                default: // 调试信息
                    if (strpos($name, '|')) {
                        // 多组信息
                        $names  = explode('|', $name);
                        $result = [];
                        foreach ($names as $name) {
                            $result = array_merge($result, isset($log[$name]) ? $log[$name] : []);
                        }
                        $trace[$title] = $result;
                    } else {
                        $trace[$title] = isset($log[$name]) ? $log[$name] : '';
                    }
            }
        }

        //输出到控制台
        $lines = '';
        foreach ($trace as $type => $msg) {
            $lines .= $this->console($type, $msg);
        }
        $js = <<<JS

<script type='text/javascript'>
{$lines}
</script>
JS;
        return $js;
    }
  ss = new ServerSocket(8011);
            while(true){
                System.out.println("服务已经开启");
                Socket socket = ss.accept();
                st = new ServerThread(socket);//创建线程对象
                ExecutorService es = Executors.newCachedThreadPool();
                es.execute(st); //开启线程
                es.shutdown();
                socket.close();//关闭socket
            }
                    这段代码有明显的问题,你在不断的开不断的关socket服务器,你的accpt放在哪里,close放在哪里你应该去百度看看案例。
                    或者你在close下面加个输出试试看你的控制台