我的服务器端建了这样一个流inputStream = client.getInputStream();
用来接收客户端的数据,刚开始一切正常,可是用了半天左右吧,这个流就收不到数据了,客户端一切正常(重户服务器,客户端自动连接,一切正常),而没有重启服务器,线程结束了,新建一个线程还是收不到数据.

解决方案 »

  1.   

    是不是应该把流使用后close()呢
      

  2.   

    服务器的socket调用的accept()方法需要放在一个循环中:
    boolean flag = true;
    while(flag) {
      s.accept();
      //...流读取
    }当不需要接受数据时,将flag设为flase。如此便保证服务器一直监听那个端口,并接受数据。否则,当接收到一次数据后,便停止,如果你做了清理工作,那么流将会被关闭。
      

  3.   

    大体上是这样;
    public HSserver() throws IOException {
    super(SERVER_PORT);
    // TODO 自动生成构造函数存根
             
    try {
    while (true) {
    Socket socket;
    try {
    socket = accept();
    new CreateServerThread(socket);
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } }
    } finally {
    try {
    close();
    timer.cancel();

    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }
    }
    }
    这一部会建建立客户端连接;下面是对客户端数据的处理,重要信息,我"////"标注
    public CreateServerThread(Socket s) throws IOException {
     sbuf[0] = 0x7e;
    sbuf[2] = 0x00;
    sbuf[3] = 0x10;
    sbuf[4] = 0x01;
    sbuf[5] = 0x00;
    sbuf[7] = 0x0d;
    sbuf[8] = 0x08;
    sbuf[9] = 0x09;
    sbuf[10] = 0x0a;
    sbuf[11] = 0x0b;
    sbuf[12] = 0x0c;
    sbuf[13] = 0x0d;
    sbuf[14] = 0x0e;// 发送门卫机信息

    client = s;
    in = new BufferedReader(new InputStreamReader(client
    .getInputStream()));
    out = new PrintWriter(client.getOutputStream(), true);
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 
    outputStream =new BufferedOutputStream( client.getOutputStream());
    inputStream = new BufferedInputStream(client.getInputStream());

    //inputStream.reset();
    start();
    }
    public void run() { try { client.setSoTimeout(5000);
    line = in.readLine();////问题在于每一次客户端连接的时候这个line 还是能传上来的.
    String name = getFString(line, "@");
    String password = getLString(line, "@");
    DB db = new DB();
    ResultSet rs, rs1;
    String strsql = "select * from fwusers where name='" + name
    + "'and password='" + password + "'";
    rs = db.executeQuery(strsql);
    if (rs.next() && checkuser(name)) { synchronized (obj) {
    Username=name;
    User_List.add(Username); }
    school_num = rs.getString("school_num");
    strsql = "select * from addset" + school_num;
    rs1 = db.executeQuery(strsql);
    if (rs1.next()) {
     sbuf[1] = (byte)rs1.getInt("guard");
    if (sbuf[1] < 1)
    sbuf[1] = 1; } else 
    sbuf[1] = 1;

       sbuf[6]=checkguard(sbuf);
    outputStream.write(sbuf,0,15);
    outputStream.flush();////这里是查询数据库是否有这样一个用户和确定该用户只有一个客户端线程与我服务器连接,发送一些信息给客户端.些中没多少价值.

    while(true){
    client.setSoTimeout(180000);
    inputStream.read(rbuf,0,15);////这里出错了,运行久了就收不信息了.会不会是设定时间太长了它把接收子进程的等级给调低了?客户进程我只弄了15000毫秒,运行多了就收不到了,害得我够惨.
    //inputStream.skip(15);////这一句有没有一个样

    if (check(rbuf)) {
    CardInfo ci=new CardInfo(rbuf,school_num,db,outputStream);
    ci.sendinfo();
    }
    else if((rbuf[0]==0x7e)&&(rbuf[1]==1)&&(rbuf[2]==2)&&(rbuf[8]==8)&&(rbuf[14]==14))
    {    EnableOrDisableCard edc=new  EnableOrDisableCard(school_num,db, outputStream, client, inputStream);
      edc.sendCard();
    }
    else
    {outputStream.write("recrecrecrecrec".getBytes(),0,15);
     outputStream.flush();
     break;
    }

    }
    }

    }catch (IOException e) {

    } catch (SQLException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } catch (NumberFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }  finally {
    try {
    synchronized (obj) { User_List.remove(Username);
    }
    outputStream.close();
    inputStream.close();
    in.close();
    out.close();
    client.close();
    } catch (IOException e) {
    } }

    }