Galera, eh o seguinte:
Eu criei um aplicativo do tipo servidor, onde eu instancio um objeto do tipo ServerSocket, e fico escutando em uma porta, e quando ele recebe uma conexão, inicia uma nova Thread. Portanto, posso ter vários client´s abertos com meu servidor. Os clientes solicitam determinadas informações, que o servidor processa e devolve a resposta. Muito bem.
O problema é o seguinte. E se eu quiser, através do servidor, fechar as minhas conexões??? Não consigo de jeito nenhum…
Meu código eh assim:
[code]package br;
import java.awt.event.;
import java.io.;
import java.net.;
import java.util.;
public class Server extends Thread implements ActionListener {
public static void main(String[] args) {
Server i = new Server();
i.carregar();
}
public void carregar(){
w = new Window();
w.setVisible(true);
w.getJMenuItemConectar().addActionListener(this);
w.getJMenuItemDesconectar().addActionListener(this);
w.getJMenuItemLimpar().addActionListener(this);
w.getJMenuItemSair().addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
// pegando a fonte do evento
Object source = event.getSource();
if(source == w.getJMenuItemSair()) {
System.exit(0);
} else if(source == w.getJMenuItemDesconectar()) {
// defina aqui o quê acontece
w.statusMenu("desconectado");
} else if(source == w.getJMenuItemConectar()) {
try
{
worker = new SwingWorker(){
public Object construct(){
conectar();
return "a";
}
};
worker.start();
w.statusMenu("conectado");
} catch (Exception e) {
w.print("Exception: " + e);
}
} else if(source == w.getJMenuItemLimpar()) {
w.limparEventos();
}
}
public void conectar() {
// instancia o vetor de clientes conectados
clientes = new Vector();
try
{
s = new ServerSocket(2222);
while(true){
Socket conexao = s.accept();
w.usuarioConectou(conexao.getRemoteSocketAddress().toString().substring(1));
w.print(conexao.getRemoteSocketAddress().toString().substring(1) + " - Conectou");
Thread t = new JsndServer(conexao);
t.start();
}
} catch (IOException e) {
w.print("IOException: " + e);
}
}
public Server(){
}
// construtor que recebe o socket deste cliente
public Server(Socket s)
{
conexao = s;
}
// execução da thread
public void run()
{
try
{
// objetos que permitem controlar fluxo de comunicação
BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
PrintStream saida = new PrintStream(conexao.getOutputStream());
clientes.add(saida);
boolean validar = true;
while(validar)
{
usuario = conexao.getRemoteSocketAddress().toString().substring(1);
send(saida, "Digite o terminal:");
// primeiramente, espera-se pelo numero do terminal
linha = entrada.readLine();
// agora, verifica se string recebida é valida, pois
// sem a conexão foi interrompida, a string é null.
// Se isso ocorrer, deve-se terminar a execução.
if (linha == null)
{
w.print(usuario + " - Encerrou");
break;
}
if (linha.length() == 0)
{
w.print(usuario + " - Encerrou");
break;
}
try
{
send(saida, linha);
terminal = Long.parseLong(linha);
//Nesse ponto se valida o terminal informado. Aqui se solicita ao Servidor as informações do terminal.
if (linha.length() == 15) {
w.print(usuario + " - Solicitou um terminal");
send(saida, "Teste solicitado. Aguarde...");
Solicitar mensagem = new Solicitar();
try{
mensagem.enviar(terminal, usuario, w);
}
catch (NAWRException exc){
if (exc.getMessage().indexOf("timeout") != -1) {
w.print(usuario + " - Timeout!");
w.acaoUsuario(usuario, "Timeout ao solicitar um terminal!\n\r");
send(saida, "Timeout ao solicitar um terminal!");
}
else {
w.print(usuario + " - Erro - " + exc.getDescripcion().toString());
send(saida, "Ocorreu uma falha no servidor!");
}
}
catch(Exception e){
w.print(usuario + " - Erro - " + e.getMessage());
send(saida, "Ocorreu uma falha no servidor!");
}
}
else{
send(saida, "O numero do terminal deve conter 15 digitos!");
}
}
catch (NumberFormatException erro)
{
send(saida, "Entre com valores numericos!");
}
}
clientes.remove(saida);
conexao.close();
w.usuarioDesconectou(usuario);
}
catch (IOException e)
{
// Caso ocorra alguma excessão de E/S, mostre qual foi.
w.print("IOException: " + e);
}
}//final do void run
// enviar uma mensagem para todos, menos para o próprio
public void send(PrintStream saida, String resposta) throws IOException
{
Enumeration e = clientes.elements();
while (e.hasMoreElements())
{
// obtém o fluxo de saída de um dos clientes
PrintStream chat = (PrintStream) e.nextElement();
// envia para todos, menos para o próprio usuário
if (chat == saida)
{
chat.println(resposta);
}
}
}
// Parte que controla as conexões por meio de threads.
// Note que a instanciação está no main.
private static Vector clientes;
// socket cliente
private Socket conexao;
// socket servidor
private ServerSocket s;
// recebe o valor digitado
private String linha;
// para validação do número
private long terminal;
// objeto gráfico
private static Window w;
private SwingWorker worker;
private String usuario = null;
}[/code]
Ai no meio tem umas chamadas de outras classes minhas, mas isso não vem ao caso. O que preciso eh de um jeito de fechar todas as conexões abertas… seja fechar os Socket´s com os clientes, ou seja fechar o ServerSocket.
Quem resolver essa merece um prêmio!!!
8O