Socket em janela lembra o msn
Publicado por Abraao dos Santos Carvalho 20/12/2007
[ Hits: 7.642 ]
Esse exemplo foi desenvolvido no netbeans. É um socket servidor e cliente, que envia mensagens de um para o outro, lembra o msn.
A conexão é encerrada quando se digita TERMINATE. Para iniciar, coloque o numero da porta nos dois, e o endereço no cliente(localhost), pode ser endereço ip se for em maquinas diferentes.
Abaixo estão os dois codigos. Caso alguém melhorar mande para mim.
peujrcarvalho@hotmail.com
/* * MsnServidor.java * * Created on 9 de Outubro de 2007, 15:08 */ package Sockets; import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * @author Abraão */ public class MsnServidor extends javax.swing.JFrame { ObjectOutputStream output; ObjectInputStream input; String message; /** Creates new form MsnServidor */ public MsnServidor() { super( "MsnServidor" ); initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { jButton1 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); janela1 = new javax.swing.JTextField(); janela2 = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); janela3 = new javax.swing.JTextArea(); jButton4 = new javax.swing.JButton(); janela4 = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setText("Iniciar"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jLabel1.setText("Receber"); jButton2.setText("Sair"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jLabel2.setText("Enviar"); janela1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { janela1ActionPerformed(evt); } }); janela2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { janela2ActionPerformed(evt); } }); janela3.setColumns(20); janela3.setRows(5); janela3.addAncestorListener(new javax.swing.event.AncestorListener() { public void ancestorMoved(javax.swing.event.AncestorEvent evt) { } public void ancestorAdded(javax.swing.event.AncestorEvent evt) { janela3AncestorAdded(evt); } public void ancestorRemoved(javax.swing.event.AncestorEvent evt) { } }); jScrollPane1.setViewportView(janela3); jButton4.setText("Limpar"); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); janela4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { janela4ActionPerformed(evt); } }); jLabel3.setText("Porta"); jLabel4.setText("Status"); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel2)) .add(layout.createSequentialGroup() .add(88, 88, 88) .add(jLabel3) .add(94, 94, 94) .add(jLabel4)) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(jButton4) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jButton1) .add(layout.createSequentialGroup() .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(jButton2) .add(jLabel1))))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(layout.createSequentialGroup() .add(janela1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 70, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(15, 15, 15) .add(janela2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 299, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE) .add(janela4)))) .addContainerGap(19, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jButton1) .add(janela1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(janela2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(51, 51, 51) .add(jLabel2)) .add(layout.createSequentialGroup() .add(37, 37, 37) .add(janela4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 59, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(24, 24, 24) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 138, Short.MAX_VALUE) .add(jButton4) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jButton2)) .add(layout.createSequentialGroup() .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 193, Short.MAX_VALUE) .addContainerGap()))) ); pack(); }// </editor-fold>//GEN-END:initComponents private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed // TODO add your handling code here: janela4.setText(""); }//GEN-LAST:event_jButton4ActionPerformed private void janela4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_janela4ActionPerformed // TODO add your handling code here: sendData( evt.getActionCommand() ); }//GEN-LAST:event_janela4ActionPerformed private void janela3AncestorAdded(javax.swing.event.AncestorEvent evt) {//GEN-FIRST:event_janela3AncestorAdded // TODO add your handling code here: }//GEN-LAST:event_janela3AncestorAdded private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed // TODO add your handling code here: System.exit(0); }//GEN-LAST:event_jButton2ActionPerformed private void janela1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_janela1ActionPerformed // TODO add your handling code here: }//GEN-LAST:event_janela1ActionPerformed private void janela2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_janela2ActionPerformed // TODO add your handling code here: }//GEN-LAST:event_janela2ActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed // TODO add your handling code here: try { new Thread_espera_conexao("teste").start(); } catch(Exception e) { janela1.setText("Whoops! Problema com o iniciar!\n"); JOptionPane.showMessageDialog(null, "Algum problema com a conexão !!!"); } }//GEN-LAST:event_jButton1ActionPerformed public class Thread_espera_conexao extends Thread { public Thread_espera_conexao(String str) { } public void run() { ServerSocket server; Socket connection; int counter = 1; try { // Step 1: Create a ServerSocket. int nporta = Integer.parseInt(janela1.getText()); server = new ServerSocket( nporta, 100 ); while ( true ) { // Step 2: Wait for a connection. janela2.setText( "Aguardando para conectar\n" ); connection = server.accept(); janela2.setText(""); janela2.setText("Conectado!!!"); janela3.append( "Conexão " + counter + " recebida para: " + connection.getInetAddress().getHostName() ); // Step 3: Get input and output streams. output = new ObjectOutputStream( connection.getOutputStream() ); output.flush(); input = new ObjectInputStream( connection.getInputStream() ); //janela3.append( "\nGot I/O streams\n" ); // Step 4: Process connection. String message = "SERVER>>> Conecção com sucesso"; output.writeObject( message ); output.flush(); janela4.setEnabled( true ); janela4.setText(""); do { try { message = (String) input.readObject(); janela3.append( "\n" + message ); janela3.setCaretPosition(janela3.getText().length());//adicioanei janela3.getText(); } catch ( ClassNotFoundException cnfex ) { janela3.append( "\nUnknown object type received" ); JOptionPane.showMessageDialog(null,"mensagem não enviada!!!"); } } while ( !message.equals( "CLIENT>>> TERMINATE" ) ); // Step 5: Close connection. janela3.append( "\nUser terminated connection" ); output.close(); input.close(); connection.close(); ++counter; } } catch ( EOFException eof ) { System.out.println( "Client terminated connection" ); JOptionPane.showMessageDialog(null,"Fim da CONEXÃO!!!"); } catch ( IOException io ) { io.printStackTrace(); } } } private void sendData( String s ) { try { output.writeObject( "SERVER>>> " + s ); output.flush(); janela3.append( "\nSERVER>>>" + s ); } catch ( IOException cnfex ) { janela3.append( "\nError writing object" ); JOptionPane.showMessageDialog(null,"Erro ao enviar!!!"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MsnServidor().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton4; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField janela1; private javax.swing.JTextField janela2; private javax.swing.JTextArea janela3; private javax.swing.JTextField janela4; // End of variables declaration//GEN-END:variables } /* * MsnCliente.java * * Created on 9 de Outubro de 2007, 15:08 */ package Sockets; import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * @author Abraão */ public class MsnCliente extends javax.swing.JFrame { ObjectOutputStream output; ObjectInputStream input; String message = ""; /** Creates new form MsnCliente */ public MsnCliente() { super( "MsnCliente" ); initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { jButton1 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); janela5 = new javax.swing.JTextArea(); jButton4 = new javax.swing.JButton(); janela1 = new javax.swing.JTextField(); janela3 = new javax.swing.JTextField(); janela4 = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); janela2 = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentHidden(java.awt.event.ComponentEvent evt) { formComponentHidden(evt); } }); jButton1.setText("Conectar"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jLabel1.setText("Recebido"); jLabel2.setText("Enviar"); jButton2.setText("Sair"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); janela5.setColumns(20); janela5.setRows(5); janela5.addAncestorListener(new javax.swing.event.AncestorListener() { public void ancestorMoved(javax.swing.event.AncestorEvent evt) { } public void ancestorAdded(javax.swing.event.AncestorEvent evt) { janela5AncestorAdded(evt); } public void ancestorRemoved(javax.swing.event.AncestorEvent evt) { } }); jScrollPane1.setViewportView(janela5); jButton4.setText("Limpar"); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); janela4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { janela4ActionPerformed(evt); } }); jLabel3.setText("Porta"); jLabel4.setText("Endere\u00e7o"); jLabel5.setText("Status"); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(94, 94, 94) .add(jLabel3) .add(83, 83, 83) .add(jLabel4)) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(jButton2) .add(layout.createSequentialGroup() .add(jLabel5) .add(13, 13, 13))) .add(jButton4) .add(jLabel1))) .add(jButton1) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel2))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(3, 3, 3) .add(janela1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 64, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(janela2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 117, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(203, 203, 203)) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) .add(org.jdesktop.layout.GroupLayout.LEADING, janela3) .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane1) .add(org.jdesktop.layout.GroupLayout.LEADING, janela4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE))))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel3) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jButton1) .add(janela1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(janela2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(6, 6, 6) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel5) .add(janela3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(20, 20, 20) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel2) .add(janela4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 51, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(20, 20, 20) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel1) .add(50, 50, 50) .add(jButton4) .add(14, 14, 14) .add(jButton2)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 196, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(11, 11, 11))) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// </editor-fold>//GEN-END:initComponents private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed // TODO add your handling code here: janela4.setText(""); }//GEN-LAST:event_jButton4ActionPerformed private void janela4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_janela4ActionPerformed // TODO add your handling code here: sendData( evt.getActionCommand() ); }//GEN-LAST:event_janela4ActionPerformed private void janela5AncestorAdded(javax.swing.event.AncestorEvent evt) {//GEN-FIRST:event_janela5AncestorAdded // TODO add your handling code here: }//GEN-LAST:event_janela5AncestorAdded private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed // TODO add your handling code here: System.exit(0); }//GEN-LAST:event_jButton2ActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed // TODO add your handling code here: try { new Thread_espera_conexao("teste").start(); } catch(Exception e) { janela1.setText("Whoops! Problema com o iniciar!\n"); JOptionPane.showMessageDialog(null, "Algum problema com a conexão !!!"); } }//GEN-LAST:event_jButton1ActionPerformed public class Thread_espera_conexao extends Thread { public Thread_espera_conexao(String str) { } public void run() { Socket client; try { int nporta = Integer.parseInt(janela1.getText()); String end_serv = janela2.getText(); client = new Socket( end_serv , nporta ); janela5.append( "Conectado para: " + client.getInetAddress().getHostName() ); janela2.setText("Conectado!!!"); // Step 2: Get the input and output streams. output = new ObjectOutputStream( client.getOutputStream() ); output.flush(); input = new ObjectInputStream( client.getInputStream() ); //janela5.append( "\nGot I/O streams\n" ); // Step 3: Process connection. janela4.setEnabled( true ); do { try { message = (String) input.readObject(); janela5.append( "\n" + message ); janela5.setCaretPosition(janela5.getText().length());//adicioanei janela5.getText(); } catch ( ClassNotFoundException cnfex ) { janela5.append( "\nUnknown object type received" ); JOptionPane.showMessageDialog(null,"mensagem não enviada!!!"); } } while ( !message.equals( "SERVER>>> TERMINATE" ) ); // Step 4: Close connection. janela5.append( "Closing connection.\n" ); output.close(); input.close(); client.close(); } catch ( EOFException eof ) { System.out.println( "Server terminated connection" ); JOptionPane.showMessageDialog(null,"Fim da CONEXÃO!!!"); } catch ( IOException e ) { e.printStackTrace(); } } } private void sendData( String s ) { try { message = s; output.writeObject( "CLIENT>>> " + s ); output.flush(); janela5.append( "\nCLIENT>>>" + s ); } catch ( IOException cnfex ) { janela5.append( "\nError writing object" ); JOptionPane.showMessageDialog(null,"Erro ao enviar!!!"); } } private void formComponentHidden(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentHidden // TODO add your handling code here: }//GEN-LAST:event_formComponentHidden /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MsnCliente().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton4; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField janela1; private javax.swing.JTextField janela2; private javax.swing.JTextField janela3; private javax.swing.JTextField janela4; private javax.swing.JTextArea janela5; // End of variables declaration//GEN-END:variables }
Nome da máquina e o endereço IP sem socket.
Comunicação através de datagramas
Um pouco de Java e Sockets. (Fonte 02: Enviador)
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta