Imprimer un fichier à distance sur navigateur

Je dois redirect le fichier journal sur mon ordinateur Linux distant et l’imprimer en sortie sur le navigateur en continu. J’ai réussi à utiliser JSch et j’imprime maintenant la sortie en tant que système. J’utilise servlet pour cela maintenant (bien que le client presse pour utiliser uniquement jsp). Le problème est que dès que j’essaie d’imprimer le stream sur le navigateur, le navigateur se bloque comme s’il chargeait continuellement quelque chose (ce qui est le cas !!). Les journaux sysout impriment parfaitement le stream sur la console lorsque le navigateur est gelé. Voici ma servlet

package sshUploader; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Run several ssh commands in a single JSch session */ import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.*; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; /** * Servlet implementation class TailLogServlet */ @WebServlet(description = "This servlet tails the remote logs", urlPatterns = { "/TailLogServlet" }) public class TailLogServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public TailLogServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub try{ System.out.println("**************************ADI NEW*****************"); JSch jsch = new JSch(); Ssortingng user = ; //CHANGE ME Ssortingng host = ; //CHANGE ME Ssortingng passwd = ; //CHANGE ME int port = 22; Session session = jsch.getSession(user, host, port); session.setPassword(passwd); Hashtable hashtable = new Hashtable(); hashtable.put("SsortingctHostKeyChecking", "no"); session.setConfig(hashtable); session.connect(); Channel channel = session.openChannel("shell"); OutputStream ops = channel.getOutputStream(); PrintStream ps = new PrintStream(ops, true); channel.connect(); InputStream input = channel.getInputStream(); ps.println("tail -f /home/LogFile.log"); ps.close(); // response.setIntHeader("Refresh", 1); response.setContentType("text/html"); /*Calendar calendar = new GregorianCalendar(); Ssortingng am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if(calendar.get(Calendar.AM_PM) == 0) am_pm = "AM"; else am_pm = "PM"; Ssortingng CT = hour+":"+ minute +":"+ second +" "+ am_pm;*/ PrintWriter out = new PrintWriter (response.getOutputStream());//.getWriter(); out.println("GuestBookServlet"); out.println("********************"); int SIZE = 1024; byte[] tmp = new byte[SIZE]; while (true) { while (input.available() > 0) { int i = input.read(tmp, 0, SIZE); if(i < 0) break; System.out.print(new String(tmp, 0, i)); // use document.write(new String(tmp, 0, i)); // System.out.println("******Adi i :"+i); //out.println("Out by Adi i :"+i); out.println(new String(tmp, 0, i)); } if(!channel.isConnected()) { System.out.println("exit-status: " + channel.getExitStatus()); break; } try { Thread.sleep(300); } catch (Exception ee) { } } out.println(""); out.close(); channel.disconnect(); session.disconnect(); }catch(Exception e){ e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } 

}

Cela ne rest qu’avec l’impression du stream. Si j’essaie d’imprimer l’heure actuelle en la mettant à jour continuellement, je peux le faire. Cela se reflète parfaitement dans le navigateur. Y a-t-il une issue pour moi?

EDIT: OK, je me suis réduit à la

cause première

. C’est le

boucle infinie

Je postule ici. Cette boucle vérifie en permanence s’il y a quelque chose dans le stream d’entrée de la télécommande. Ainsi, les sysouts sont imprimés correctement mais les out.write ne le sont pas. Si je supprime la boucle while infinie, une ligne s’imprime comme étant le seul élément du stream d’entrée distant. Des idées sur la façon dont je peux obtenir la sortie sur le navigateur à l’intérieur d’une boucle infinie while?

Ok, je l’ai finalement fait après y avoir passé du temps. Mise à jour tardive comme il était occupé dans la livraison du client. Voici les étapes.
Préparé un servlet appelé TailLogServlet.java qui a le code de suivi des journaux distants. Préparé un jsp appelé showTailLogs.jsp qui appelle cette servlet via ajax toutes les 2 secondes et imprime la réponse sur le navigateur. Cet appel est effectué dans la fonction onLoad du corps de jsp.
Voici le servlet et jsp:

showTailLogs.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>       Show Tail Logs    

Show Tail Logs

TailLogServlet.java

 package sshUploader; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Run several ssh commands in a single JSch session */ import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.*; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; /** * Servlet implementation class TailLogServlet */ @WebServlet(description = "This servlet tails the remote logs", urlPatterns = { "/TailLogServlet" }) public class TailLogServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public TailLogServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //System.out.println("*************GETTT TailLogServlet Hit. logFileName :"+request.getParameter("logFileName")); PrintWriter pw=response.getWriter(); response.setContentType("text/html"); response.setHeader("Cache-Control", "no-cache"); JSch jsch = new JSch(); Ssortingng user = request.getParameter("logUID"); //CHANGE ME Ssortingng host = request.getParameter("host");//CHANGE ME Ssortingng passwd = request.getParameter("logPwd"); //CHANGE ME int port = 22; Session session = jsch.getSession(user, host, port); session.setPassword(passwd); Hashtable hashtable = new Hashtable(); hashtable.put("SsortingctHostKeyChecking", "no"); session.setConfig(hashtable); session.connect(); Channel channel = session.openChannel("shell"); OutputStream ops = channel.getOutputStream(); PrintStream ps = new PrintStream(ops, true); channel.connect(); InputStream input = channel.getInputStream(); ps.println("tail -f "+request.getParameter("logFileName")); ps.close(); int SIZE = 1024; byte[] tmp = new byte[SIZE]; long startTime = System.currentTimeMillis(); while ((System.currentTimeMillis()-startTime)< 3*1000){ while (input.available() > 0) { int i = input.read(tmp, 0, SIZE); if(i < 0) break; System.out.println(new String(tmp, 0, i)); pw.println(new String(tmp, 0, i)); } pw.flush(); } }catch(Exception e) { e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //System.out.println("*************POSTTTTT TailLogServlet Hit. logFileName :"+request.getParameter("logFileName")); doGet(request, response); } } 

Le code peut avoir des importations indésirables car je n'ai pas encore effectué le nettoyage.