我使用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下面加个输出试试看你的控制台