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();
}
}