最近练习写个QQ!!
但就是不知道为什么,当我用ObjectOutputStream的writeObject()时,老是报:java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1838)
        at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1747)
        at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1249)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1203)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1387)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1538)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:329)
        at org.lifeng.server.Server.sendObject(Server.java:220)
        at org.lifeng.server.Server.sendStatus(Server.java:166)
        at org.lifeng.server.Server.processStream(Server.java:141)
        at org.lifeng.server.Server.run(Server.java:50)-------------------------------------------------------------------------------------以下是部分代码:
private void sendStatus() throws IOException {
try {
//首先就是要将所有朋友的 状态信息、离线消息 发送给本连接
String sql = "select status,nickname,userid,saying from UserInfo where userid in(Select friendid from friendinfo where " + "hostid=" + userid + ")";
//发送所有的朋友的状态
ResultSet rs = r.executeQuery(sql);
while (rs.next()) {
sendObject(rs.getBoolean(1));
sendObject(rs.getString(2));
sendObject(rs.getInt(3));
sendObject(rs.getString(4));
}
rs.close();
//发送所有朋友发送的离线消息。
String sql1 = "select fromid,content,createtime from MessageInfo where toid=" + userid + " and readflag=false";
ResultSet rs1 = r.executeQuery(sql1);
while (rs1.next()) {
//以后我用网络传递数据,只用String和Integer和Double什么的,最好全部用string
sendObject(new Integer(rs1.getInt(1)));
sendObject(rs1.getString(2));
String s = rs1.getDate(3).toString();
// System.out.println(rs1.getString(3));
// System.out.println(rs1.getDate(3));
sendObject(s);
}
rs1.close();
//设置所有的离线信息为已读信息
String sqlUpdate = "Update MessageInfo set readflag=true where toid=" + userid + " and readflag=false";
r.executeUpdate(sqlUpdate);
} catch (SQLException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}//向sock发送数据对象
private void sendObject(Object mess) throws IOException {
oos.writeObject(mess);
oos.flush();
}