Java服务器套接字在一段时间后断开

Java服务器套接字在一段时间后断开,java,sockets,disconnect,Java,Sockets,Disconnect,我已经编写了一个创建线程并打开套接字的服务器。客户端是用Flash编写的。一段时间后,服务器不再响应客户端 服务器: 我无法从您的代码中判断此建议是否适用,但从套接字读取或写入的线程不应执行其他操作。读线程应该将其数据排队,而写线程应该从数据队列馈送。读和写应该在不同的线程中完成 否则,缓冲和实际数据传输的不可预测性将保证出现意外的失速情况。您所说的“无响应”是什么意思?客户端或服务器端是否存在某种错误?可能是耗尽了资源(线程仍处于活动状态,或者套接字未关闭?)主服务器线程工作,他正在其中一个计

我已经编写了一个创建线程并打开套接字的服务器。客户端是用Flash编写的。一段时间后,服务器不再响应客户端

服务器:
我无法从您的代码中判断此建议是否适用,但从套接字读取或写入的线程不应执行其他操作。读线程应该将其数据排队,而写线程应该从数据队列馈送。读和写应该在不同的线程中完成


否则,缓冲和实际数据传输的不可预测性将保证出现意外的失速情况。

您所说的“无响应”是什么意思?客户端或服务器端是否存在某种错误?可能是耗尽了资源(线程仍处于活动状态,或者套接字未关闭?)主服务器线程工作,他正在其中一个计时器中完成一个作业,但连接不工作。没有资源问题,正如我在Debugger中看到的,线程正在正确关闭。你们看到我的密码有错吗?等等。你所说的“主服务器线程工作,他正在其中一个计时器中完成一项工作”是什么意思?主服务器线程必须只侦听连接,并创建线程子线程并为其分配连接。没有其他的,否则服务器会显得很忙(它会这样做)。那是什么?这是一个问题吗?编辑你的问题是不合适的。我们不会因为你得到答案就删除内容。谢谢,我会改变的。我不知道。
public appGameServer(String Ip){
  try{
      _SS = new ServerSocket(appMain.CONFIG_GAME_PORT);
      _SS.setSoTimeout(0);
      _startTime = System.currentTimeMillis();
      _gameServerThread = new Thread(this);
      _gameServerThread.start();
      try{
          _startFunctions();
       }
       catch (Exception e) {
          e.printStackTrace();
          Debug.err.println(e.getMessage());
      }
  } catch (IOException e) {
      Debug.err.println("Could not listen on port " + appMain.CONFIG_GAME_PORT);
      e.printStackTrace();
         System.exit(0);
    }
}

public void _startFunctions(){
    actiuniGlobale.schedule(new TimerTask(){
        public void run(){
        }
    }, 0,500);
}
@Override
public void run(){ 
    while(appMain.isRunning) {
        try {
            _clients.add(new appMainSystem(_SS.accept()));
            _jucatoriOnline = _clients.size();
        }catch(IOException e){
            e.printStackTrace();
            Debug.err.println(e.getMessage());
        }
    }
}

public static void delClient(appMainSystem serverPrincipal) {
    try{
        synchronized (_clients){
            _clients.remove(serverPrincipal);
            _jucatoriOnline = _clients.size();
        }
    }catch(Exception e){
        e.printStackTrace();
       Debug.err.println(e.getMessage());
    }
}

public static void kickAll()
{
    try {
        _SS.close();
    } catch (IOException e) {}

    List<appMainSystem> c = Collections.synchronizedList(new ArrayList<appMainSystem>());
    c.addAll(_clients);
    for(appMainSystem GT : c) {
        try {
             GT.closeSocket();
        } catch(Exception e) {           
            e.printStackTrace();
            Debug.err.println(e.getMessage());};  
    }
}
public appMainSystem(Socket sock) {
    try{
        _s = sock;
        _s.setSoTimeout(0);
        _in = new BufferedReader(new InputStreamReader(_s.getInputStream()));
        _out = new PrintWriter(_s.getOutputStream(),true);
        try{
            _t = new Thread(this);
            _t.setDaemon(true);
            _t.start();
        }
        catch (Exception e) {
            Debug.err.println(e.getMessage());
            e.printStackTrace();
        }
    }
    catch (IOException e) {
        Debug.err.println(e.getMessage());
        e.printStackTrace();
        if(!_s.isClosed()){
            try{
                _s.close();
            } catch (IOException e1) {Debug.err.println(e1.getMessage());e1.printStackTrace();}
        }
    }
}

public void run(){
    try{
        String packet = "";
        char charCur[] = new char[1];
        while(_in.read(charCur)!=-1 && appMain.isRunning)  {
            if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r') {
                packet += charCur[0];
            } else if(!packet.isEmpty()) {
                packet = new String(packet.getBytes(),"UTF8");
                try {
                    verificaPacket(packet);
                } catch(Exception e) {
                    Debug.err.println(e.getMessage());
                    e.printStackTrace();
                }
                packet = "";
            }
        }
    }catch(Exception e) {
        kick();
    }
    finally
    {
        if(!lastPacketRecv.isEmpty()) kick();
    }
}   
public void kick()
{
    try{
        appGameServer.delClient(this);
        closeSockets();
    } catch(Exception e){
        Debug.err.println(e.getMessage());
        e.printStackTrace();
    }
}

public void closeSockets() throws IOException {
    _in.close();
    _out.close();
    if(!_s.isClosed()) closeSocket();
    _t.interrupt();
} 

public void closeSocket()
{
    try {
        _s.close();
    } catch (IOException e) {           
        Debug.err.println(e.getMessage());
        e.printStackTrace();
    }
}