From 5b9d88bf9ad21998edc909b15865c5c0534a0e8d Mon Sep 17 00:00:00 2001 From: Dimas Date: Fri, 9 Jun 2017 15:49:44 -0300 Subject: [PATCH 1/3] I love threads --- Chat/source/sinGUI/Server.java | 34 ++++++++++++-- Chat/source/threaded/chat/Participante.java | 29 ++++++++++-- Chat/source/threaded/chat/Servidor.java | 52 +++++++++++++++++++-- 3 files changed, 104 insertions(+), 11 deletions(-) diff --git a/Chat/source/sinGUI/Server.java b/Chat/source/sinGUI/Server.java index 94d8770..bf6048d 100644 --- a/Chat/source/sinGUI/Server.java +++ b/Chat/source/sinGUI/Server.java @@ -8,7 +8,13 @@ import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; - +/* + * + * + * https://stackoverflow.com/questions/4981214/change-value-of-a-variable-x-in-main-method-through-running-thread + * + * + */ public class Server extends Thread { ArrayList clientes = new ArrayList(5); public static void main(String [] args) throws IOException { @@ -19,19 +25,39 @@ public static void main(String [] args) throws IOException { public void run() { //Socket nuevoCliente= server.accept(); } + public Server() throws IOException { - + ArrayList clientes = new ArrayList(5); int puertoEscuchaServer = 1234; + System.out.println("SERVER: server on, listening on " + puertoEscuchaServer); ServerSocket server = new ServerSocket(puertoEscuchaServer); - Socket nuevoCliente; System.out.println("SERVER: awaiting connection on " + server.getLocalPort()); + + Thread aceptarNuevoCliente = new Thread(){ + @Override + public void run(){ + try { + while (true){ + System.out.println("esperando"); + clientes.add( server.accept() ); + System.out.println("aceptado!"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + + aceptarNuevoCliente.start(); + + /* while (true) { nuevoCliente = server.accept(); clientes.add( nuevoCliente ); System.out.println("se conectó " + nuevoCliente.getLocalSocketAddress() + " a través de " + nuevoCliente.getPort()); } - + */ //server.close(); /* diff --git a/Chat/source/threaded/chat/Participante.java b/Chat/source/threaded/chat/Participante.java index 90a1c9b..7025d02 100644 --- a/Chat/source/threaded/chat/Participante.java +++ b/Chat/source/threaded/chat/Participante.java @@ -1,11 +1,29 @@ package threaded.chat; +import java.net.InetAddress; +import java.net.Socket; public class Participante { private String name; - private String IP; + private String stringIP; + private InetAddress IP; + private Socket socket; + /** + * @param socket the socket to set + */ + public void setSocket(Socket socket) { + this.socket = socket; + } + + /** + * @return the socket + */ + public Socket getSocket() { + return socket; + } + public String getName(){ return name; } @@ -25,11 +43,16 @@ public Participante(String n) { public void setIP(String ip) { - IP = ip; + stringIP = ip; } public String getIP() { - return IP; + return stringIP; + } + + public void setIP(InetAddress inetAddress) { + IP = inetAddress; + } } diff --git a/Chat/source/threaded/chat/Servidor.java b/Chat/source/threaded/chat/Servidor.java index 423b6d0..6bb5bba 100644 --- a/Chat/source/threaded/chat/Servidor.java +++ b/Chat/source/threaded/chat/Servidor.java @@ -9,7 +9,9 @@ import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; +import java.util.ArrayList; +import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; @@ -43,8 +45,10 @@ public void run() { /** * Create the frame. + * @throws IOException */ - public Servidor() { + public Servidor() throws IOException { + setAlwaysOnTop(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); @@ -52,7 +56,9 @@ public Servidor() { setContentPane(contentPane); contentPane.setLayout(null); - JList clientsList = new JList(); + + DefaultListModel lista = new DefaultListModel(); + JList clientsList = new JList(lista); clientsList.setBounds(5, 37, 151, 219); contentPane.add(clientsList); @@ -61,12 +67,50 @@ public Servidor() { contentPane.add(serverInfo); serverInfo.setColumns(10); + ArrayList clientes = new ArrayList(5); int puertoEscuchaServer = 1234; - //acá necesito crear un thread generador de threads + System.out.println("SERVER: server on, listening on " + puertoEscuchaServer); + ServerSocket server = new ServerSocket(puertoEscuchaServer); + System.out.println("SERVER: awaiting connection on " + server.getLocalPort()); - Thread t = new Thread(); + Thread desconexionCliente = new Thread(){ + @Override + public void run(){ + while (true){ + for(int i = 0; i < lista.getSize(); i++){ + if (!lista.get(i).getSocket().isConnected()){ + lista.remove(i); + } + } + } + } + }; + Thread aceptarNuevoCliente = new Thread(){ + @Override + public void run(){ + try { + while (true){ + + System.out.println("esperando"); + Socket nuevoCliente = server.accept(); + + clientes.add( nuevoCliente ); + Participante nuevo = new Participante("nombre"); + nuevo.setSocket(nuevoCliente); + nuevo.setIP(nuevoCliente.getInetAddress()); + lista.addElement(nuevo); + + System.out.println("aceptado!"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + aceptarNuevoCliente.start(); + desconexionCliente.start(); } } From 44616b119cf3c0aaf22b58de4c8355997628557b Mon Sep 17 00:00:00 2001 From: Dimas Date: Fri, 9 Jun 2017 16:15:37 -0300 Subject: [PATCH 2/3] why you not go away --- Chat/source/threaded/chat/Participante.java | 25 ++++++++------------- Chat/source/threaded/chat/Servidor.java | 17 ++++++++++++-- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Chat/source/threaded/chat/Participante.java b/Chat/source/threaded/chat/Participante.java index 7025d02..3dd5147 100644 --- a/Chat/source/threaded/chat/Participante.java +++ b/Chat/source/threaded/chat/Participante.java @@ -6,7 +6,6 @@ public class Participante { private String name; - private String stringIP; private InetAddress IP; private Socket socket; @@ -28,31 +27,25 @@ public String getName(){ return name; } - public String toString() { - return name; + public String showYourself() { + return "Participante [name=" + name + ", IP=" + IP + ", socket=" + socket + ", is closed:" + socket.isClosed() + + ", isconnected: " + socket.isConnected() + "]"; } - - public Participante(String n) { name = n; } - - - - - public void setIP(String ip) { - stringIP = ip; - } - - public String getIP() { - return stringIP; + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return name; } public void setIP(InetAddress inetAddress) { IP = inetAddress; - } } diff --git a/Chat/source/threaded/chat/Servidor.java b/Chat/source/threaded/chat/Servidor.java index 6bb5bba..6678ced 100644 --- a/Chat/source/threaded/chat/Servidor.java +++ b/Chat/source/threaded/chat/Servidor.java @@ -67,7 +67,7 @@ public Servidor() throws IOException { contentPane.add(serverInfo); serverInfo.setColumns(10); - ArrayList clientes = new ArrayList(5); + ///ArrayList clientes = new ArrayList(5); int puertoEscuchaServer = 1234; System.out.println("SERVER: server on, listening on " + puertoEscuchaServer); @@ -79,9 +79,21 @@ public Servidor() throws IOException { public void run(){ while (true){ for(int i = 0; i < lista.getSize(); i++){ + System.out.println(lista.get(i).showYourself()); + + try { + sleep(777); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (!lista.get(i).getSocket().isConnected()){ + System.out.println("i should remove client " + i); lista.remove(i); } + else { + + } } } } @@ -95,10 +107,11 @@ public void run(){ System.out.println("esperando"); Socket nuevoCliente = server.accept(); - clientes.add( nuevoCliente ); + //clientes.add( nuevoCliente ); Participante nuevo = new Participante("nombre"); nuevo.setSocket(nuevoCliente); nuevo.setIP(nuevoCliente.getInetAddress()); + lista.addElement(nuevo); System.out.println("aceptado!"); From 9dffe03a795bd85a584e032c00f43f18594ad213 Mon Sep 17 00:00:00 2001 From: Dimas Date: Sat, 10 Jun 2017 01:29:29 -0300 Subject: [PATCH 3/3] no se hablan --- Chat/source/echo/EchoClient.java | 25 ++--- Chat/source/threaded/chat/Cliente.java | 43 +++++-- Chat/source/threaded/chat/ServerListener.java | 43 ------- Chat/source/threaded/chat/Servidor.java | 105 +++++++++++++++--- .../threaded/chat/VentanaPrincipal.java | 86 +++++++++++++- 5 files changed, 216 insertions(+), 86 deletions(-) delete mode 100644 Chat/source/threaded/chat/ServerListener.java diff --git a/Chat/source/echo/EchoClient.java b/Chat/source/echo/EchoClient.java index 6e27c01..66ac806 100644 --- a/Chat/source/echo/EchoClient.java +++ b/Chat/source/echo/EchoClient.java @@ -38,33 +38,30 @@ public class EchoClient { public static void main(String[] args) throws IOException { - String hostName = "localhost"; + String serverName = "localhost"; //int portNumber = Integer.parseInt(args[1]); int portNumber = 1234; try ( - Socket echoSocket = new Socket(hostName, portNumber); - PrintWriter out = - new PrintWriter(echoSocket.getOutputStream(), true); - BufferedReader in = - new BufferedReader( - new InputStreamReader(echoSocket.getInputStream())); - BufferedReader stdIn = - new BufferedReader( - new InputStreamReader(System.in)) - ) { + Socket echoSocket = new Socket(serverName, portNumber); + PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader( new InputStreamReader(echoSocket.getInputStream())); + BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)) + ) + { System.out.println("server says: " + in.readLine()); String userInput; - while ((userInput = stdIn.readLine()) != "\n") { + while ((userInput = stdIn.readLine()) != "") { out.println(userInput); System.out.println("server says: " + in.readLine()); } + } catch (UnknownHostException e) { - System.err.println("Don't know about host " + hostName); + System.err.println("Don't know about host " + serverName); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to " + - hostName); + serverName); System.exit(1); } } diff --git a/Chat/source/threaded/chat/Cliente.java b/Chat/source/threaded/chat/Cliente.java index f5ec70f..474b055 100644 --- a/Chat/source/threaded/chat/Cliente.java +++ b/Chat/source/threaded/chat/Cliente.java @@ -1,12 +1,41 @@ package threaded.chat; +import java.awt.BorderLayout; +import java.awt.EventQueue; -import java.net.Socket; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; -public class Cliente { - Socket socket; - - public Cliente(){ - socket = new Socket(); - +public class Cliente extends JFrame { + + private JPanel contentPane; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + Cliente frame = new Cliente(); + frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); } + + /** + * Create the frame. + */ + public Cliente() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 450, 300); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + contentPane.setLayout(null); + } + } diff --git a/Chat/source/threaded/chat/ServerListener.java b/Chat/source/threaded/chat/ServerListener.java deleted file mode 100644 index 4fd5ebb..0000000 --- a/Chat/source/threaded/chat/ServerListener.java +++ /dev/null @@ -1,43 +0,0 @@ -package threaded.chat; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.net.ServerSocket; -import java.net.Socket; - -public class ServerListener extends Thread { - Thread t; - int puerto; - public ServerListener(int port){ - puerto = port; - } - @Override - public void run() { - int puertoEscuchaServer = puerto; - try ( - ServerSocket serverSocket = new ServerSocket(puertoEscuchaServer); - Socket clientSocket = serverSocket.accept(); - PrintWriter out2 = - new PrintWriter(clientSocket.getOutputStream(), true); - BufferedReader in = new BufferedReader( - new InputStreamReader(clientSocket.getInputStream())); - DataOutputStream out = - new DataOutputStream(clientSocket.getOutputStream()); - ) { - - while (in.readLine() != "\n") { - out.writeUTF("this is my response"); - } - }catch (IOException e) { - System.out.println("Exception caught when trying to listen on port " - + puertoEscuchaServer + " or listening for a connection"); - System.out.println(e.getMessage()); - } - - } - - -} diff --git a/Chat/source/threaded/chat/Servidor.java b/Chat/source/threaded/chat/Servidor.java index 6678ced..7c88a87 100644 --- a/Chat/source/threaded/chat/Servidor.java +++ b/Chat/source/threaded/chat/Servidor.java @@ -1,22 +1,23 @@ package threaded.chat; -import java.awt.BorderLayout; import java.awt.EventQueue; -import java.io.BufferedReader; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; -import java.util.ArrayList; - import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JList; import javax.swing.JTextField; +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.ListSelectionEvent; public class Servidor extends JFrame { @@ -26,6 +27,8 @@ public class Servidor extends JFrame { private static final long serialVersionUID = -2368066290807734787L; private JPanel contentPane; private JTextField serverInfo; + private JTextField txtMensaje; + private JButton btnSend; /** * Launch the application. @@ -35,6 +38,7 @@ public static void main(String[] args) { public void run() { try { Servidor frame = new Servidor(); + System.out.println("SERVER - constructor"); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); @@ -59,6 +63,7 @@ public Servidor() throws IOException { DefaultListModel lista = new DefaultListModel(); JList clientsList = new JList(lista); + clientsList.setBounds(5, 37, 151, 219); contentPane.add(clientsList); @@ -67,6 +72,62 @@ public Servidor() throws IOException { contentPane.add(serverInfo); serverInfo.setColumns(10); + JButton btnKick = new JButton("kick"); + btnKick.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + Participante echar = clientsList.getSelectedValue(); + try { + System.out.println("echando a " + echar.getName()); + PrintWriter out = new PrintWriter(echar.getSocket().getOutputStream(), true); + + out.print("Z"); + echar.getSocket().close(); + lista.removeElement(echar); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + btnKick.setBounds(166, 34, 89, 23); + contentPane.add(btnKick); + + txtMensaje = new JTextField(); + txtMensaje.setBounds(166, 115, 258, 20); + contentPane.add(txtMensaje); + txtMensaje.setColumns(10); + + btnSend = new JButton("send"); + btnSend.setEnabled(false); + btnSend.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + Participante destinatario = clientsList.getSelectedValue(); + try { + DataOutputStream output = new DataOutputStream(destinatario.getSocket().getOutputStream()); + System.out.println("SERVER: sending message to " + destinatario.getName() + ": " + txtMensaje.getText()); + output.writeChars(txtMensaje.getText() ); + } catch (IOException e) { + System.err.println(e.getMessage()); + e.printStackTrace(); + } + } + }); + btnSend.setBounds(166, 146, 89, 23); + contentPane.add(btnSend); + + clientsList.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent arg0) { + if (clientsList.getModel().getSize() < 1) + btnSend.setEnabled(false); + else + btnSend.setEnabled(true); + if (lista.size() < 1 ) + btnSend.setEnabled(false); + else + btnSend.setEnabled(true); + } + }); + + ///ArrayList clientes = new ArrayList(5); int puertoEscuchaServer = 1234; @@ -77,22 +138,25 @@ public Servidor() throws IOException { Thread desconexionCliente = new Thread(){ @Override public void run(){ + System.out.println("SERVER: thread desconexionCliente start"); + try { + sleep(2000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } while (true){ for(int i = 0; i < lista.getSize(); i++){ - System.out.println(lista.get(i).showYourself()); - try { - sleep(777); - } catch (InterruptedException e) { - e.printStackTrace(); + sleep(500); + } catch (InterruptedException e1) { + e1.printStackTrace(); } - - if (!lista.get(i).getSocket().isConnected()){ - System.out.println("i should remove client " + i); - lista.remove(i); + try{ + lista.get(i).getSocket().getOutputStream().write((byte) 162); } - else { - + catch(IOException e){ + System.err.println("cliente " + i + ": " + lista.get(i).getName() + " desconectado"); + lista.remove(i); } } } @@ -106,15 +170,20 @@ public void run(){ System.out.println("esperando"); Socket nuevoCliente = server.accept(); + System.out.println("nuevo cliente aceptado!"); + nuevoCliente.setKeepAlive(true); //clientes.add( nuevoCliente ); - Participante nuevo = new Participante("nombre"); + DataInputStream input = new DataInputStream( nuevoCliente.getInputStream()); + String clientName = input.readUTF(); + System.out.println("client name: " + clientName); + Participante nuevo = new Participante(clientName); nuevo.setSocket(nuevoCliente); nuevo.setIP(nuevoCliente.getInetAddress()); lista.addElement(nuevo); - System.out.println("aceptado!"); + } } catch (IOException e) { e.printStackTrace(); diff --git a/Chat/source/threaded/chat/VentanaPrincipal.java b/Chat/source/threaded/chat/VentanaPrincipal.java index 903afbb..05668cb 100644 --- a/Chat/source/threaded/chat/VentanaPrincipal.java +++ b/Chat/source/threaded/chat/VentanaPrincipal.java @@ -2,6 +2,14 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; import java.util.HashMap; import java.util.List; @@ -13,6 +21,7 @@ import java.awt.Component; import javax.swing.Box; import javax.swing.DefaultListModel; +import javax.swing.JTextArea; public class VentanaPrincipal extends JFrame { //ArrayList arlistparticipantes = new ArrayList(5); @@ -51,9 +60,18 @@ public void actionPerformed(ActionEvent evt) { */ public VentanaPrincipal(String user, String IP) { + + + + String serverName = "localhost"; + int portNumber = 1234; + + + + setTitle(user + "@" + IP); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 364, 386); contentPane = new JPanel(); + setBounds(100, 100, 429, 386); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); @@ -95,6 +113,12 @@ public void actionPerformed(ActionEvent e) { btnAgregarParticipante.setBounds(23, 294, 131, 23); contentPane.add(btnAgregarParticipante); + JTextArea txtrServerMessage = new JTextArea(); + txtrServerMessage.setLineWrap(true); + txtrServerMessage.setText("server message"); + txtrServerMessage.setBounds(221, 45, 182, 128); + contentPane.add(txtrServerMessage); + ActionListener nuevoChat = new ActionListener() { @Override @@ -109,7 +133,63 @@ public void actionPerformed(ActionEvent e) { JButton btnLlamarASegunda = new JButton("Iniciar Chat"); btnLlamarASegunda.addActionListener(nuevoChat); btnLlamarASegunda.setBounds(221, 11, 89, 23); - contentPane.add(btnLlamarASegunda); + contentPane.add(btnLlamarASegunda); + + + + + Thread conexion = new Thread(){ + @Override + public void run() { + try ( + Socket serverSocket = new Socket(serverName, portNumber); + PrintWriter out = new PrintWriter(serverSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader( new InputStreamReader(serverSocket.getInputStream())); + BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); + DataInputStream fromServer = new DataInputStream(serverSocket.getInputStream()); + DataOutputStream toServer = new DataOutputStream(serverSocket.getOutputStream()); + ) + { + + //out.println(user); + toServer.writeUTF(user); + String mensaje = fromServer.readLine();// = fromServer.readUTF(); + System.out.println("mensaje: " + mensaje); + while (mensaje != "kick"){ + System.out.println("mensaje: " + mensaje ); + sleep(777); + txtrServerMessage.setText( txtrServerMessage.getText() + mensaje ); + mensaje = fromServer.readLine(); + + } + System.err.println("OUT OF THE WHILE!!"); + out.flush(); + /* + String userInput; + while ((userInput = stdIn.readLine()) != "") { + out.println(userInput); + System.out.println("server says: " + in.readLine()); + } + */ + + } catch (UnknownHostException e) { + System.err.println("Server " + serverName + " is unkown"); + System.exit(1); + } catch (IOException e) { + System.err.println("Couldn't get I/O for the connection to " + + serverName); + System.exit(1); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + } + }; + + conexion.start(); } @@ -124,6 +204,4 @@ protected void nuevoChat(List seleccionados) { new AbrirChatConThread(participantesNuevoChat).start(); } - - }