解决方案 »

  1.   

    at java.net.Socket.getInputStream(Unknown Source)
    at Server.model.qqServerThread.run(qqServerThread.java:19)
    java.net.SocketException: Socket is closedObjectInputStream ois=new ObjectInputStream(s.getInputStream());说这个已关闭
      

  2.   

    这个问题很明显呀~~你在服务端来实例化一个服务端线程实例,而且把s(socket)的引用也传给了线程实例,这个线程一启动,就一直在while(true)中运行着,可以是的服务端的,实例化线程实例,你看你做了什么,穿了消息,然后就关掉了s.close()。而线程实例端孩子while(true)里面sb一样的执行,当他发现socket突然发现已经close了,他肯定造反了。所以报错了。
      

  3.   

    服务器端
    package Server.model;import i.qq.common.Message;
    import i.qq.common.User;import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.security.interfaces.RSAKey;
    import java.sql.ResultSet;
    import java.sql.SQLException;import qq.server.DB.qqServerSqlHelp;public class Serverqq {
    qqServerSqlHelp qqss=null;
    public Serverqq() {
    System.out.print("服务器在9999端口监听");
    try {
    ServerSocket ss = new ServerSocket(9999);
    while (true) {
    Socket s = ss.accept();
    ObjectInputStream ois = new ObjectInputStream(
    s.getInputStream());
    User u = (User) ois.readObject();
    Message ms = new Message();
    String sql = "select 用户名 from Denlu where 用户名=? and 密码=?";
    String pasa[] = { u.getUs(), u.getPw() };
       qqss = new qqServerSqlHelp();
    ResultSet rs = qqss.Query(sql, pasa);
    ObjectOutputStream oos = new ObjectOutputStream(
    s.getOutputStream());
    if (rs.next()) {
    rs.getString(1);
    ms.setMessType("1");
    oos.writeObject(ms);
    //一对一单开一个线程
    qqServerThread qqst=new qqServerThread(s);
    qqst.start();
    }else {
    ms.setMessType("2");
    oos.writeObject(ms);
    s.close();
    }
    }
    } catch (IOException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }finally{
    qqss.close();
    }
    }
    }
    package Server.model;import i.qq.common.Message;import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;public class qqServerThread extends Thread{
    Socket s;
    public qqServerThread(Socket s) {
    this.s=s;// TODO 自动生成的构造函数存根
    }
    public void  run(){
    while(true){
    try {
    ObjectInputStream ois=new ObjectInputStream(s.getInputStream());//这句异常
    Message ms=(Message)ois.readObject();
    System.out.print(ms.getId()+"对"+ms.getSender()+"说:"+ms.getInformation());
    } catch (IOException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }
    }
    }
    }
    客户端
    package i.qq.model;import i.qq.common.Message;
    import i.qq.common.User;import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Writer;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JOptionPane;public class ConServer {
    public boolean clientCon(Object o){
    boolean b=false;
    //连接服务器
    try {
    ConServerSocket css=new ConServerSocket();
    Socket s=css.ConSocket();
    ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
    oos.writeObject(o);
    ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
    Message ms=(Message)ois.readObject();
    if(ms.getMessType().equals("1")){
    b=true;
    }else if(ms.getMessType().equals("2")){
    b=false;
    s.close();
    }
    } catch (UnknownHostException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    } catch (IOException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    } catch (ClassNotFoundException e1) {
    // TODO 自动生成的 catch 块
    e1.printStackTrace();
    }
    return b;
    }
    }
    ​at Server.model.qqServerThread.run(qqServerThread.java:19)
    java.io.EOFException
      

  4.   

    如果对应的socket流关闭,对应的socket也会关闭。