Como fechar a sessão quando o broser é fechado ou o usuario sair da pagina?

Eu estou desenvolvendo um player e ele continua rodando mesmo depois de fechada :frowning:
por favor me ajudem, como faço pra descobrir quando o usuario saiu da pagina???

Como é que ele continua tocando? Quando o usuário fecha a página não fecha também o player não?

pior que não… sempre trabalhei com projetos desktop e recentemente to trabalhando com projetos web, tem alguma regra pra se trabalhar com isso ???

A questão é, como é que ele não fecha?

Se o usuário fecha a página o player não deveria fechar automaticamente? Como é que você fez esse player?

Eu fiz um player simples da um olhada :slight_smile:

public class TESTE {

public void testPlay(String filename) {
	try {
		File file = new File(filename);
		AudioInputStream in = AudioSystem.getAudioInputStream(file);
		System.out.println(file.getName());
		AudioInputStream din = null;
		AudioFormat baseFormat = in.getFormat();
		AudioFormat decodedFormat = new AudioFormat(
				AudioFormat.Encoding.PCM_SIGNED,
				baseFormat.getSampleRate(), 16, baseFormat.getChannels(),
				baseFormat.getChannels() * 2, baseFormat.getSampleRate(),
				false);
		din = AudioSystem.getAudioInputStream(decodedFormat, in);
		// Play now.
		rawplay(decodedFormat, din);
		in.close();
	} catch (Exception e) {
		//Handle exception.
	}
}

private void rawplay(AudioFormat targetFormat, AudioInputStream din)
		throws IOException, LineUnavailableException {
	byte[] data = new byte[4096];
	SourceDataLine line = getLine(targetFormat);
	if (line != null) {
		// Start
		line.start();
		int nBytesRead = 0, nBytesWritten = 0;
		while (nBytesRead != -1) {
			nBytesRead = din.read(data, 0, data.length);
			if (nBytesRead != -1)
				nBytesWritten = line.write(data, 0, nBytesRead);

		}
		// Stop
		line.drain();
		line.stop();
		line.close();
		din.close();
	}
}

private SourceDataLine getLine(AudioFormat audioFormat)
		throws LineUnavailableException {
	SourceDataLine res = null;
	DataLine.Info info = new DataLine.Info(SourceDataLine.class,
			audioFormat);
	res = (SourceDataLine) AudioSystem.getLine(info);
	res.open(audioFormat);
	return res;
}

}

essa é minha pagina jsp

<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<%@ taglib prefix=“f” uri=“http://java.sun.com/jsf/core”%>
<%@ taglib prefix=“h” uri=“http://java.sun.com/jsf/html”%>
<%@ taglib prefix=“rich” uri=“http://richfaces.org/rich”%>
<%@ taglib prefix=“a4j” uri=“http://richfaces.org/a4j”%>

Insert title here play

[code]public class TESTE {

public void testPlay(String filename) {
	try {
		File file = new File(filename);
		AudioInputStream in = AudioSystem.getAudioInputStream(file);
		System.out.println(file.getName());
		AudioInputStream din = null;
		AudioFormat baseFormat = in.getFormat();
		AudioFormat decodedFormat = new AudioFormat(
				AudioFormat.Encoding.PCM_SIGNED,
				baseFormat.getSampleRate(), 16, baseFormat.getChannels(),
				baseFormat.getChannels() * 2, baseFormat.getSampleRate(),
				false);
		din = AudioSystem.getAudioInputStream(decodedFormat, in);
		// Play now.
		rawplay(decodedFormat, din);
		in.close();
	} catch (Exception e) {
		//Handle exception.
	}
}

private void rawplay(AudioFormat targetFormat, AudioInputStream din)
		throws IOException, LineUnavailableException {
	byte[] data = new byte[4096];
	SourceDataLine line = getLine(targetFormat);
	if (line != null) {
		// Start
		line.start();
		int nBytesRead = 0, nBytesWritten = 0;
		while (nBytesRead != -1) {
			nBytesRead = din.read(data, 0, data.length);
			if (nBytesRead != -1)
				nBytesWritten = line.write(data, 0, nBytesRead);

		}
		// Stop
		line.drain();
		line.stop();
		line.close();
		din.close();
	}
}

private SourceDataLine getLine(AudioFormat audioFormat)
		throws LineUnavailableException {
	SourceDataLine res = null;
	DataLine.Info info = new DataLine.Info(SourceDataLine.class,
			audioFormat);
	res = (SourceDataLine) AudioSystem.getLine(info);
	res.open(audioFormat);
	return res;
}

}[/code]

essa é minha pagina jsp

[code]<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<%@ taglib prefix=“f” uri=“http://java.sun.com/jsf/core”%>
<%@ taglib prefix=“h” uri=“http://java.sun.com/jsf/html”%>
<%@ taglib prefix=“rich” uri=“http://richfaces.org/rich”%>
<%@ taglib prefix=“a4j” uri=“http://richfaces.org/a4j”%>

Insert title here play [/code]

Não faltou você postar nada ai não? não encontrei o método ‘play’ na classe TESTE que você postou! de qualquer maneira, você manda executar o player, ele roda na máquina servidor, que no caso é a sua máquina (acredito eu), enquanto o processo estiver lá… vai continuar tocando mesmo. faz um teste simples, manda tocar, fecha a página e manda parar o seu container.

desculpa a pagina tá asssim…
você ta falando de parar o servidor?
se for isso o player para normalmente

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class Player  {
	public void play() {
		try {

			File file = new File("Teste.wav");
			if (!file.isFile()) {
				
			}
		
			AudioInputStream in = AudioSystem.getAudioInputStream(file);
			AudioInputStream din = null;
			AudioFormat baseFormat = in.getFormat();
			AudioFormat decodedFormat = new AudioFormat(
					AudioFormat.Encoding.PCM_SIGNED,
					baseFormat.getSampleRate(), 16, baseFormat.getChannels(),
					baseFormat.getChannels() * 2, baseFormat.getSampleRate(),
					false);
			din = AudioSystem.getAudioInputStream(decodedFormat, in);
		
			rawplay(decodedFormat, din);
			in.close();
		} catch (Exception e) {
			e.printStackTrace();

		}

	}

	private void rawplay(AudioFormat targetFormat, AudioInputStream din)
			throws IOException, LineUnavailableException {
		byte[] data = new byte[4096];
		SourceDataLine line = getLine(targetFormat);
		if (line != null) {
			// Start
			line.start();
			int nBytesRead = 0, nBytesWritten = 0;
			while (nBytesRead != -1) {
				nBytesRead = din.read(data, 0, data.length);
				if (nBytesRead != -1)
					nBytesWritten = line.write(data, 0, nBytesRead);

			}
			// Stop
			line.drain();
			line.stop();
			line.close();
			din.close();
		}
	}

	private SourceDataLine getLine(AudioFormat audioFormat)
			throws LineUnavailableException {
		SourceDataLine res = null;
		DataLine.Info info = new DataLine.Info(SourceDataLine.class,
				audioFormat);
		res = (SourceDataLine) AudioSystem.getLine(info);
		res.open(audioFormat);

		return res;
	}

	

}

O player esta rodando em um servlet correto?

Você pode por um script no seu documento jsp para que quando ele feche a janela seja feita uma request usando ajax que faça o player desligar.

Então está funcionando corretamente não? é a mesma coisa que você clicar em um botão na sua página e no Managed Bean você dar um JOptionPane.showMessageDialog(null,“OLA”); resultado? vai aparecer para você a mensagem ainda que você feche o browser a caixa com a mensagem vai continuar lá, apenas para saber… você sabe que isso só está acontecendo porque você está na máquina que está como servidor certo?

O Fábio Kung relatou que certa vez trabalhou com um cara que fez isso que eu disse (do JOptionPane) e achou que tinha revolucionado os sistemas web… ele só não se atentou ao simples detalhe que o container estava na máquina dele, adivinha o que aconteceu quando ele subiu a aplicação na máquina de produção??? (maiores detalhes sobre essa história com o Fábio Kung, rsrs)

eu não me toquei nessa parte, :frowning:
no cliente não ta rodando o player, quando o cliente aperta no play toca no lado do servidor :cry: