Primeiramente muito Obrigado.Segue abaixo o código:
O servidor para, isto é, não acontece reação nenhuma.mas os clientes continuam enviando mensagem e conectando tb.( programa de mensagem instantânea.
//TCPServerThreads.java by Ledón, fev/2005
import java.io.;
import java.net.; //para acesso às classes Socket e ServerSocket
import java.awt.;
import java.awt.event.; //para atenção a eventos
import javax.swing.; //acceso aos componentes de interface do pacote Swing
import javax.swing.border.; //para utilizar painéis com bordas
import java.util.*;
public class TCPServerThreads extends JFrame implements ActionListener{ /implements ActionListener/
//servidor para a comunicação:
private static ServerSocket serverSocket;
private static Vector clientes; //para armazenar os clientes conectados
//objetos para a interface:
private static JTextArea t1 = new JTextArea(15,30);
private JScrollPane scroller = new JScrollPane(t1);
//private JPanel p1 = new JPanel();
private JLabel l1 = new JLabel(“Digite seu nome e depois mensagens (ou fim):”);
private JTextField t2 = new JTextField(18);
private JButton b1 = new JButton(“Enviar a todos”);
private JButton b2 = new JButton(“Enviar a”);
private JButton b3 = new JButton(“Fechar Um”);
private JButton b4 = new JButton(“Fechar Todos”);
private JPanel
p1 = new JPanel(),
p2 = new JPanel(),
p3 = new JPanel(),
p4 = new JPanel(),
p5 = new JPanel();
private String texto="";
DefaultListModel listModel1 = new DefaultListModel();
JList list1 = new JList(listModel1);
JScrollPane scroll3 = new JScrollPane(list1);
public void enviarATodosDesdeServidor(String quem, String mensagem) throws IOException {
for (Enumeration e = clientes.elements() ; e.hasMoreElements() ;) {
UmCliente cli = (UmCliente) e.nextElement();
cli.outToClient.writeObject(quem + ": " + mensagem);
}
}
public TCPServerThreads(){
super(“Aplicativo Servidor”);
Container cp = getContentPane();
cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS));
p1.setBorder(new TitledBorder(" Mensagens “));
p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
p1.add(scroller);
//cp.add(p1);
//p1.setBorder(new TitledBorder(” Mensagens “));
// p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
p2.setBorder(new TitledBorder(” Texto para envio “));
p5.setLayout(new BoxLayout(p5, BoxLayout.X_AXIS));
p3.setBorder(new TitledBorder(” Para enviar “));
p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
p4.setLayout(new BoxLayout(p4, BoxLayout.X_AXIS));
p4.setBorder(new TitledBorder(” Usuários Conectados “));
p3.setBorder(new TitledBorder(” Para enviar "));
p1.add(scroller);
p2.add(l1);
p2.add(t2);
p5.add(p2);
p5.add(p3);
p3.add(b1);
p3.add(b2);
p3.add(b3);
p3.add(b4);
p4.add(scroll3);
//listModel1.addElement(umCliente);
listModel1.addElement(“cadeira”);
listModel1.addElement(“copo”);
listModel1.addElement(“guardanapo”);
listModel1.addElement(“janela”);
listModel1.addElement(“toalha de mesa”);
cp.add(p1);
//cp.add(p2);
//cp.add(p3);
cp.add(p5);
cp.add(p4);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
}
public static void main(String argv[]) throws Exception {
System.out.println(“Iniciando o servidor…”);
TCPServerThreads janela = new TCPServerThreads();
janela.setSize(400, 400);
janela.setTitle(" Aplicativo Servidor");
janela.setVisible(true);
//registramos um tratador para o evento windowClosing:
janela.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
try{
// fecha a conexão do cliente e os objetos de E/S:
System.out.println("Encerrando o servidor...");
FecharSockets();
}catch(Exception exc){
}
System.exit(0);
}
}//fim da classe interna anônima
);//fim do parâmetro de addWindowListener
[i][b]clientes = new Vector();[/b][/i]
// JOptionPane.showMessageDialog(null,clientes.firstElement());
serverSocket = new ServerSocket(5000); //usamos porta 5000
while(true){
//criamos um cliente, enviando como parâmetros
//o objeto servidor e o objeto da área de texto
//para mensagens:
UmCliente cliente = new UmCliente(serverSocket,t1,clientes);
clientes.add(cliente);
//System.out.println("Clientes:"+cliente);
cliente.start();
}
}
public static void FecharSockets(){
for (Enumeration e = clientes.elements() ; e.hasMoreElements()
{
System.out.println("\nDestiva um cliente ativo");
UmCliente cli = (UmCliente) e.nextElement();
}
for (Enumeration e = clientes.elements() ; e.hasMoreElements()
{
UmCliente cli = (UmCliente) e.nextElement();
cli.desativa(); //desativamos cada Thread (objeto de UmCliente)
}
clientes.removeAllElements();//esvaziamos o vetor de clientes
}//de FecharSockets
public void actionPerformed( ActionEvent event )
{
if ( event.getSource() == b1 ){
try{
[i][b]String x = (String)clientes.get(0);
listModel1.addElement(x); [/b][/i]
enviarATodosDesdeServidor("Servidor diz:", t2.getText());
//Vector.parsevector(clientes);
//listModel1.addElement("oi");
//listModel1.addElement(x);
//listModel1.insertElementAt((String)clientes.firstElement(),0);
//listModel1.insertElementAt(t2.getText(),0);
t2.setText("");
//return (TipodeRetorno) teste.firstElement();
}
catch(Exception e) { }
}
if ( event.getSource() == b2 ){
JOptionPane.showMessageDialog(null," Botão B2 - enviar a um");
}
if ( event.getSource() == b3 ){
JOptionPane.showMessageDialog(null," Botão B3 - fechar um");
}
if ( event.getSource() == b4 ){
JOptionPane.showMessageDialog(null," Botão B4 - fechar todos");
}
}
}
class UmCliente extends Thread { //Observe, classe derivada de Thread
public ObjectOutputStream outToClient;
private ObjectInputStream inFromClient;
private Socket socket;
public String nomeCliente="";
private JTextArea textoSaida; //para acesso à tela do Server
private boolean ativa;
private Vector clientes;
private String vetorcliente[];
private int p =0;
public UmCliente(ServerSocket serverSocket, JTextArea inJTextArea, Vector inClientes) {
try{
socket = serverSocket.accept();
outToClient = new ObjectOutputStream(socket.getOutputStream());
outToClient.flush();
inFromClient = new ObjectInputStream(socket.getInputStream());
textoSaida = inJTextArea;
ativa=true;
clientes = inClientes;
}catch (Exception e1){
}
}
public void desativa(){
try{
outToClient.writeObject("FIM Server");
outToClient.flush();
} catch(Exception e3){
}
ativa = false;
}
public void Mensagem(String txt){
textoSaida.setText(textoSaida.getText() + txt + "\n");
}
public void run()
{
String texto = "\nUm aplicativo cliente em " + socket.getInetAddress() + " - " + socket.getInetAddress().getHostName() + " tenta se comunicar\n";
Mensagem(texto); //mensagem para a tela do servidor
try{
do{ // ciclo de espera pela conexão de algum cliente
sleep(150); //esta Thread "dormirá" 150 milisegundos
texto = (String) inFromClient.readObject(); // lê uma linha do cliente
if(nomeCliente==""){
nomeCliente = texto;
texto = "se conectou.....";
}
//vetorcliente[p];
//vetorcliente[p]+= nomeCliente;
//p++;
//for (int h=0; h<3; h++)
//System.out.println("Nome do Cliente..."+vetorcliente[p]);
System.out.println("Nome do Cliente..."+nomeCliente);
enviarATodos(nomeCliente,texto); //mensagens para os clientes
Mensagem(nomeCliente + ": " + texto); //mensagem para a tela do servidor
} while (ativa);
// fecha a conexão com o servidor e os objetos de E/S:
enviarATodos(nomeCliente,"se desconectou....."); //msg para os clientes
Mensagem(nomeCliente + ": se desconectou..."); //mensagem para a tela do servidor
outToClient.writeObject("FIM"); //para que a tela do cliente feche
clientes.remove(this); //se auto-elimina da lista de clientes
socket.close();
inFromClient.close();
outToClient.close();
} catch(Exception e2){
}//do try
}//fim do método run()
public void enviarATodos(String quem, String mensagem) throws IOException {
for (Enumeration e = clientes.elements() ; e.hasMoreElements()
{
UmCliente cli = (UmCliente) e.nextElement();
cli.outToClient.writeObject(quem + ": " + mensagem);
}
}
public void enviarATodosMenosEu(String quem, String mensagem) throws IOException {
//não estamos usando este método, mas poderia ser interessante
for (Enumeration e = clientes.elements() ; e.hasMoreElements()
{
UmCliente cli = (UmCliente) e.nextElement();
if(cli!=this)cli.outToClient.writeObject(quem + ": " + mensagem);
}
}
}//fim da classe UmCliente