GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Sockets

Boa noite pessoal…
podem me ajudar?
Criei um pequeno bate papo com Sockets…
O problema que a mensagem enviada não chega de primeira para todos os clientes do chat.
Não estou conseguindo ver o meu erro…


segue o codigo …

package GrupoBatePapo;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;

import java.awt.Font;

import javax.swing.JTextArea;
import javax.swing.JTextPane;

public class BatePapoCli extends JFrame {

public JPanel contentPane;
public JTextField textField;
public JButton btnEnviar;
public  PrintWriter pw;
public Socket	socket;
public String nome;
public JTextArea textarea;
public JScrollPane scroll;
public Scanner leitor;

private class escultaServidor implements Runnable{	  // thread recebe informação atraves de um scanner e acrescentado na textarea

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		try{
	
			String texto;
		
				while((texto=leitor.nextLine())!= null){  // leitor é um scanner
				
						
					textarea.append(texto + "\n");
				
				}
		
		}catch(Exception e){
			
		}
	
	} // fim run

} // fim class



public BatePapoCli(String nome1) {
	
	super("Conversação :"+nome1);
	this.nome=nome1;
	inicializacao();
	acoes();

}	


public void inicializacao(){	
	
	
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 527, 339);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);
	
	textField = new JTextField();
	textField.setBounds(101, 255, 283, 35);
	contentPane.add(textField);
	textField.setColumns(10);
	
	JLabel lblMensagem = new JLabel("Mensagem");
	lblMensagem.setFont(new Font("Berlin Sans FB Demi", Font.BOLD, 12));
	lblMensagem.setBounds(21, 254, 76, 35);
	contentPane.add(lblMensagem);
	
	btnEnviar = new JButton("Enviar");
	btnEnviar.setBounds(412, 267, 76, 23);
	contentPane.add(btnEnviar);
	
	textarea = new JTextArea();
	textarea.setBounds(101, 11, 283, 217);
	textarea.setColumns(1);
	contentPane.add(textarea);
	
	scroll=new JScrollPane(textarea);
	scroll.setBounds(101, 11, 283, 217);
	contentPane.add(scroll);
	
	
		
				
		


}

	


public void acoes(){
	
	btnEnviar.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e){
			
			conectaServidor();							// metodo conecta com o servidor .Esse metodo contem socket e um printwrite
			
			pw.println(nome+" :"+textField.getText());  // o printwriter recebe a variavel nome e o valor do textfield
			
														//obs: quando clicar um scanner tambem recebe valores do servidor	
				
			textField.setText("");
			pw.flush();
			
		}
	});
}

	public void conectaServidor(){
		
		try {
			socket=new Socket("192.168.0.110",5000);
			pw=new PrintWriter(socket.getOutputStream());
			leitor=new Scanner(socket.getInputStream());		//scanner recebe informação do servidor 
			
			new Thread(new escultaServidor()).start();     
			
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


			
	
	

	public static void main(String[] args) {
		
		
		
		new BatePapoCli("Michel").setVisible(true);
		new BatePapoCli("Roberto").setVisible(true);
		

	}

}

Agora o servidor…

package GrupoBatePapo;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ServidorChat {

List<PrintWriter> escritores=new ArrayList<>();
ServerSocket servidor;
Scanner sc;


private void encaminharParaTodos(String text){
	for(PrintWriter w: escritores){
		try{
			
			w.println(text);
			w.flush();
	
		}catch(Exception e){
		
		
		}	
	}
}





public ServidorChat(){

	

			try {
		
				servidor=new ServerSocket(5000);
		
				while(true){
			
					Socket s=servidor.accept();
					new Thread(new Cliente(s)).start();   // criando uma thread passando como parametro a classe cliente que recebe como parametro o socket
					PrintWriter p=new PrintWriter(s.getOutputStream());
					escritores.add(p);
					
				}
	
	
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	
	
}

private class Cliente implements Runnable {

	public Scanner sc1;
	

	public Cliente(Socket socket){ // metodo construtor com 3 parametros
	
		try {
			sc1 =new Scanner(socket.getInputStream());
		
		} catch (IOException e) {
		
			e.printStackTrace();
		}
	
	}

	public void run() {
	// TODO Auto-generated method stub
		
		try{
			String conv;
			
			while((conv= sc1.nextLine())!= null){
		
			
				encaminharParaTodos(conv);
			}
		}catch(Exception e){
		
		}	
	}

}

public static void main(String args[]){
	
	new ServidorChat();
	
}

}

//