Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器两小时后停止_Java_Sockets - Fatal编程技术网

Java服务器两小时后停止

Java服务器两小时后停止,java,sockets,Java,Sockets,hello everybady我有一个简单的服务器,通过tcp接收文件正常工作,但如果请求不是来自客户端2小时,我的服务器将无所事事。如果客户端想在2小时后从服务器请求,服务器将无所事事。 你有什么建议吗 import java.io.BufferedInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeout

hello everybady我有一个简单的服务器,通过tcp接收文件正常工作,但如果请求不是来自客户端2小时,我的服务器将无所事事。如果客户端想在2小时后从服务器请求,服务器将无所事事。 你有什么建议吗

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
/* w  ww . jav  a 2 s . c  o m*/


public class Main extends Thread {
  private ServerSocket serverSocket;
  public final static int FILE_SIZE =128*1204;//128k 
  int bytesRead;

  public Main () throws IOException {
    serverSocket = new ServerSocket(1072);

  }

  public void run() {

      BufferedInputStream bis=null; 

      System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
      Socket client=null;

try {
        client = serverSocket.accept();
        System.out.println("1:"+client.getKeepAlive());
        client.setKeepAlive(true);

    } catch (IOException e1) {
        e1.printStackTrace();
    }

      System.out.println("Just connected to " + client.getRemoteSocketAddress());

while (true) {

   try {

        byte [] mybytearray_rec  = new byte [FILE_SIZE];
        bis = new BufferedInputStream(client.getInputStream());
        String s=null;
        while(bis.available()>0)
        {
        bytesRead =bis.read(mybytearray_rec); 
        s = new String(mybytearray_rec,0,bytesRead);
        System.out.print(s);
       }

      } catch (SocketTimeoutException s) {
          System.out.println("SocketTimeoutException:"+s);
          break;
      } catch (IOException e) {
         System.out.println("IOException:"+e);
         e.printStackTrace();
        break;
      }catch (Exception e) {
       System.out.println("Exception:"+e);
       e.printStackTrace();
       break;
     }


    }//While;



  }

  public static void main(String[] args) throws InterruptedException {
    try {
      Thread t = new Main ();
      t.start();
     } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

正如你的问题目前所写,这只是对可能发生的事情的猜测

while
循环的位置为服务器提供了以下逻辑(伪代码):

那是错误的。网络中可能有许多组件将中止非活动连接,因为它包含未使用的资源

你应使用:

LISTEN for a client
LOOP
    ACCEPT a client
    PROCESS A TRANSATION with client
    CLOSE the connection
    [ wait next message possibly 2 hours]

这样,连接将正确关闭,而不是保持不活动状态,客户端将为每个新事务打开一个干净的连接。

您想在2小时后结束服务器吗?您的服务器在哪里?如果您使用红帽Openshift或类似的解决方案,这可能是正常的,因为我注意到如果用户机器闲置一段时间,他们会关闭用户机器。很难理解您的问题。你能试着用谷歌翻译一下吗,也就是说,再发一次吗?将缓冲区大小从1204调整为1024。将while(true)替换为非无止境条件,并移除中断。
LISTEN for a client
LOOP
    ACCEPT a client
    PROCESS A TRANSATION with client
    CLOSE the connection
    [ wait next message possibly 2 hours]