Por que não é possível estabelecer conexão com o servidor?

10 respostas Resolvido
Thallysson

Olá, eu estou desenvolvendo um “interpretador de comandos”, bom, primeiramente eu fiz a classe Server que cria um fica ouvindo a porta 12345 na minha máquina, estão depois eu uma interface de usuário onde eu digitava um comando e ele era recebido pelo servidor, porém modifiquei as classes para que quando eu me conecte eu receba algumas informações do servidor, minhas classes são as seguintes:
Classe MainWindow (janela que recebe os comandos):
`

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class MainWindow extends JFrame implements KeyListener{
	
	private static final long serialVersionUID = 1L;
	static ArrayList<JLabel> labels = new ArrayList<>();
	JTextField comamndLine = new JTextField();
	static JPanel log = new JPanel();
	private static Socket client;
	static boolean conected;

	MainWindow(){
		
		conected = conect();
		
		setTitle("Client");
		setLayout(new BorderLayout());
		
		log.setLayout(new BoxLayout(log, BoxLayout.Y_AXIS));
		log.setBackground(Color.BLACK);
		log.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		JScrollPane scroll = new JScrollPane(log);
		add(scroll,BorderLayout.CENTER);
		comamndLine.addKeyListener(this);
		comamndLine.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		comamndLine.setForeground(Color.GREEN);
		comamndLine.setBackground(Color.BLACK);
		add(comamndLine,BorderLayout.SOUTH);
		
		setSize(new Dimension(500,500));
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	public static void main(String[]args){
		new Server();
		//conected = conect();
		new MainWindow();
	}
	public boolean conect(){
		try {
			client = new Socket("127.0.0.1",12345);
			System.out.println("conectou...");
			ObjectInputStream entrada = new ObjectInputStream(client.getInputStream());
			String[] data = (String[]) entrada.readObject();
			String arc = data[0];
			String osName = data[1];
			String osVersion = data[2];
			String userName = data[3];
			String userHome = data[4];
			JLabel start = new JLabel("Start conecion with: "+InetAddress.getLocalHost().getHostAddress()+":\n"
									 + "systemArc: "+arc+"\n"
									 + "osName: "+osName+"\n"
									 + "osVersion: "+osVersion+"\n"
									 + "userName: "+userName+"\n"
									 + "userHome: "+userHome+"\n");
			labels.add(start);
			log.add(start);
			this.validate();
			return true;
		} catch (IOException | ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		}
	}
	public void keyPressed(KeyEvent evento) {
		if(evento.getSource()==comamndLine && evento.getKeyCode()==KeyEvent.VK_ENTER){
			final String comando = comamndLine.getText();
			JLabel label = new JLabel("Client comand: "+comando);
			label.setForeground(Color.GREEN);
			comamndLine.setText("");
			labels.add(label);
			log.add(label);
			this.validate();
			final boolean resultado = enviarComando(comando);
				if(resultado){
					JLabel label2 = new JLabel("\tCommand received");
					label2.setForeground(Color.GREEN);
					labels.add(label2);
					log.add(label2);
				}else{
					JLabel label2 = new JLabel("\tCommand not received");
					label2.setForeground(Color.GREEN);
					labels.add(label2);
					log.add(label2);
				}
		}
	}
	public void keyReleased(KeyEvent arg0) {
	}
	public void keyTyped(KeyEvent arg0) {
	}
	public boolean enviarComando(String comando){
		 try {
		      //client = new Socket("127.0.0.1",12345);
			  if(conected){
			      ObjectOutputStream saida = new ObjectOutputStream(client.getOutputStream());
			      saida.flush();
			      saida.writeObject(comando);
			      saida.close();	
			  }
		      System.out.println("Conexão encerrada");
		      return true;
		    }
		    catch(Exception e) {
		      System.out.println("Erro: " + e.getMessage());
		      return false;
		    }
	}
}
`

Classe Server:
`

package ui;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;

public class Server {
	 private static ServerSocket servidor;

	public static void main(String[] args) {
		    try {
		      servidor = new ServerSocket(12345);
		      System.out.println("servidor ouvindo a porta 12345");
		      while(true) {
		        Socket cliente = servidor.accept();
		        ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());
		        saida.flush();
		        final String[] data = {System.getProperty("os.arch"),
						        	   System.getProperty("os.name"),
						        	   System.getProperty("os.version"),
						        	   System.getProperty("user.name"),
						        	   System.getProperty("user.home")};
		        saida.writeObject(data);
		        saida.close();

		       // ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
		        //final String comando = (String) entrada.readObject();
		        
		        cliente.close();
		      }  
		    }   
		    catch(Exception e) {
		       System.out.println("Erro: " + e.getMessage());
		    }
		  }     
}
`

Era para tudo funcionar corretamente porém este erro é exibido:
`

java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at ui.MainWindow.conect(MainWindow.java:64)
	at ui.MainWindow.<init>(MainWindow.java:34)
	at ui.MainWindow.main(MainWindow.java:60)
`

Alguém sabe me dizer porque que isso acontece?

10 Respostas

Jonas_B_a_r_r_o_s

Você está dando new Server() no seu cliente, sendo que o Server tem o metodo main. E o metodo main é so para exibr as informações do servidor?
Acredito que esse Exception DualStackPlainSocketImpl seja porque você está instanciando o Socket de forma impropria.
Fiz uma classe Server aqui para você ter uma noção. Você pode adapatar. Mas primeiro teste como está

import java.io.BufferedReader;
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 java.util.Iterator;

public class Server {    
    ArrayList clientOutputStreams;
    static ServerSocket serverSock;
       
                
    public class ClienteHandler implements Runnable {
        BufferedReader reader;
        Socket sock;
        
        public ClienteHandler(Socket clientSocket) {
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);
                
            } catch(Exception ex){}
        }
        
        @Override
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
                    System.out.println ("Lido " + message);
                    tellEveryone(message);
                }
            } catch (Exception ex) {}
                
    }      
}
    
    public void go() {
        clientOutputStreams = new ArrayList();
        try {
            serverSock = new ServerSocket(4242);
            while(true) {
                Socket clienteSocket = serverSock.accept();
                PrintWriter writer = new PrintWriter(clienteSocket.getOutputStream());
                clientOutputStreams.add(writer);
                Thread t = new Thread(new ClienteHandler(clienteSocket));
                t.start();             
            }
        } catch (Exception ex) {        }   
}   
       
    
   static ArrayList<String> lista = new ArrayList<>();

   public static ArrayList<String> exibe() throws IOException {
              String dados = "";
              dados += "\n"+System.getProperty("os.arch");
              dados += "\n"+System.getProperty("os.name");
              dados += "\n"+System.getProperty("os.version");
              dados += "\n"+System.getProperty("user.name");
              dados += "\n"+System.getProperty("user.home");
              lista.add(dados);
              return lista;
   }
    
public void tellEveryone(String message) {
    Iterator it = clientOutputStreams.iterator();
    while (it.hasNext()) {
        try {
            PrintWriter writer = (PrintWriter) it.next();
            writer.println (message);
            writer.flush();
            
        } catch (Exception ex) {   }
} } 

}

Na classe cliente, no main, instancie normalmente o server assim:.
Server server = new Server();
server.go():

//e quando quiser exibir as informações vindas do servidor
System.out.println(Server.exibe());

//Altere a porta para 4242, talvez seja mais apropriada

E caso queira pegar o IP da maquina, você pode usar esse metodo

public String pegaIp() throws UnknownHostException{
    String ip = Inet4Address.getLocalHost().getHostAddress();
    return ip;
    }

//E usar assim: client = new Socket(pegaIp(),12345);
//Assim, mesmo se você usar seu programa em outra maquina, não precisa se preocupar em modificar o ip
Thallysson

Olá, eu estava instanciando a classe server na mainwindow para testes, a aplicação servidor vai ser separada no futuro, agora a pouco eu percebi se eu criar um novo projeto com essa classe, gerar o jar e executar o servidor fica ativo e tudo funciona corretamente, porém por enquanto eu não quero fazer isso, agradeço muito por me ajudar a fazer a classe server, já tenho um pouco de experiencia com o java mas nunca trabalhei com sockets, eu planejei em que quando eu me conectasse ao servidor eu recebesse informações sobre o servidor, e o client exibir essas informações, depois disso eu queria que os comandos que eu mandasse fossem interpretados, sobre o ip eu gostaria de exibir só pra saber com que máquina eu estou conectado, tem como ser o ip externo ao invés do interno? bom aparentemente agora está tudo funcionando, porém nada está sendo executado depois do Server server = new Server(); server.go():

Thallysson

Oi, sobre a questão de nada ser executado depois, eu só coloquei dentro de uma thread e funcionou :slight_smile:
Obrigado por tudo, só que eu estou com dois problemas ainda:
-Como vou fazer em um projeto separado no futuro não vou instanciar o servidor certo? Então como eu farei para pegar aquelas informações do exibe?
-Como eu faço para que o servidor receba os comandos, eu envio pra ele e isso:System.out.println ("Lido " + message); nunca é executado.
-Ainda estou com a dúvida do ip

Jonas_B_a_r_r_o_s

Não, você vai ter que instanciar sempre o servidor para que ele fique rodando. Percebeu que tem uma Thread dentro do metodo go().
A parte que te falei System.out.println(Server.exibe()); não funcionou?

Na verdade essa parte do codigo que você se refere ("Lido "+message); Você deve codificar no seu cliente, mais ou menos assim:

//coloque em sua classe cliente o PrintWriter
PrintWriter writer;

//depois crie um metodo para enviar comandos ao servidor
//fiz esse metodo simples, execute ele em seu cliente

private void enviarCmd() {                                            
        try {
            writer.println ("seu comando");
            writer.flush();
        } catch (Exception ex) {
        }
    }

Faz o teste:

A parte do IP; dê um ipconfig no cmd, compare com o que é exibido no metodo pegaIp().

Thallysson

Bom, primeiramente me desculpe pela minha ignorância, é a primeira vez que eu trabalho com sockets no java, estou lendo, estudando, procurando, montando e desmontando código a vários dias, bom pelo que eu li sobre o PrintWriter ele serve para enviar Strings certo? Eu estava planejando fazer uma espécie de interpretador de comandos onde eu enviava a String do comando ao servidor então ele interpretava esse comando e me retornava um objeto, podia ser String, BufferedImage, entre outros, tem como fazer isso com o PrinterWriter?
Sobre a parte do Server.exibe() está tudo funcionando corretamente.
Sobre o ip, bom até onde eu sei o retorno do ipconfig é o ip local certo? Caso não seja possível coletar o ip externo em java, pode ignorar, eu só coloquei isso para identificar onde eu estou conectado mas não é necessário.

Jonas_B_a_r_r_o_s

Cara, na verdade com PrintWriter não seria o mais indicado, na verdade eu nunca testei ele com objetos. Neste caso você teria que usar RMI, para invocação de metodos, e consequentemente dentro dos metodos, os objetos

Thallysson

Bom, eu modifiquei meu código, como o fiz tudo funcionar corretamente com ObjectInputStream e ObjectOutputStream porém depois de enviar um BufferedImage não da para enviar mais nada e com Strings eu envio quantas quiser sem problema algum.

Jonas_B_a_r_r_o_s

Como assim não dá para enviar mais nada? O programa trava?

Tente criar uma classe que estenda BufferedImage, e no seu construtor você pode setar as opções que desejar. Depois tente enviar ao server. Talvez seja melhor tambem você deixar o server como estava. Ele vai aceitar Object tambem.

Ex:

public class Img  extends  BufferedImage{
    
    public Img(int width, int height, int imageType) {
        super(width, height, imageType);
    }
    
}

Depois instancie no seu cliente, e envie ao server

Thallysson

Bom, agora o erro ta um pouco diferente e meu código está completamente desorganizado (fiquei transformando algumas partes do código em comentário e criando outras), mas vou postar as duas classes para você entender o que eu estou dizendo:
Classe MainWindow:
`

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class MainWindow extends JFrame implements KeyListener{
	
	private static final long serialVersionUID = 1L;
	static ArrayList<JLabel> labels = new ArrayList<>();
	JTextField commandLine = new JTextField();
	static JPanel log = new JPanel();
	private static Socket client;
	static boolean conected;
	private static Server m = new Server();
	Object sRetorno ;
	boolean available = true;
	private JLabel retorno = null;
	 
	MainWindow(){
		
		conected = conect();
		
		setTitle("Client");
		setLayout(new BorderLayout());
		
		log.setLayout(new BoxLayout(log, BoxLayout.Y_AXIS));
		log.setBackground(Color.BLACK);
		log.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		JScrollPane scroll = new JScrollPane(log);
		add(scroll,BorderLayout.CENTER);
		commandLine.addKeyListener(this);
		commandLine.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		commandLine.setForeground(Color.GREEN);
		commandLine.setBackground(Color.BLACK);
		commandLine.setCaretColor(Color.GREEN);
		add(commandLine,BorderLayout.SOUTH);
		
		setSize(new Dimension(500,500));
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	public static void main(String[]args){
		System.out.println("entrou");
		new Thread(new Runnable(){
			public void run(){
				try {
					m.go();
				} catch (Exception e) {
					e.printStackTrace();
				}	
			}
		}).start();
		System.out.println("passou");
		//conected = conect();
		new MainWindow();
	}
	public boolean conect(){
		try {
			try{
				client = new Socket("127.0.0.1",4242);
			}catch(ConnectException e){
				JLabel erro = new JLabel("The server is not available");
				erro.setForeground(Color.RED);
				labels.add(erro);
				log.add(erro);
				this.validate();
				available = false;
			}
			if(available){
				System.out.println("conectou...");
				
				ArrayList<String> informacoes = m.exibe();
				String arc = informacoes.get(0);
				System.out.println(arc);
				String osName = informacoes.get(1);
				System.out.println(osName);
				String osVersion = informacoes.get(2);
				System.out.println(osVersion);
				String userName = informacoes.get(3);
				System.out.println(userName);
				String userHome = informacoes.get(4);
				System.out.println(userHome);
				JLabel start = new JLabel("<html>Start conecion with server<br/>"
										 + "systemArc: "+arc+"<br/>"
										 + "osName: "+osName+"<br/>"
										 + "osVersion: "+osVersion+"<br/>"
										 + "userName: "+userName+"<br/>"
										 + "userHome: "+userHome+"<br/></html>");
				start.setForeground(Color.GREEN);
				labels.add(start);
				log.add(start);
				this.validate();
				return true;
			}else{
				return false;
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	public void keyPressed(KeyEvent evento) {
		if(evento.getSource()==commandLine && evento.getKeyCode()==KeyEvent.VK_ENTER){
			final String comando = commandLine.getText();
			commandLine.setText("");
			if(comando!=""){
				if(available){
					final String exit = comando.toLowerCase();
					System.out.println("exit: "+exit);
					if(!exit.equals("exit")){
						System.out.println("iniciado o processo de envio do comando");
						JLabel label = new JLabel("Client comand: "+comando);
						label.setForeground(Color.GREEN);
						labels.add(label);
						log.add(label);
						this.validate();
						final boolean resultado = enviarComando(comando);
							if(resultado){
								System.out.println("----------------");
								JLabel label2 = new JLabel("\tCommand received");
								if(sRetorno instanceof String){
									if(sRetorno.equals("command does not accept")){
										retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned:</font><br/><font color=red>"+sRetorno+"</font></html>");
									}else{
										retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned: "+sRetorno+"</font></html>");
									}
								}else if(sRetorno instanceof BufferedImage){
									retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned: </font><font color=red>A image...</font></html>");
									JFrame exibeImagem = new JFrame("Screenshot");
									exibeImagem.setLayout(new BorderLayout());
									JLabel imagem = new JLabel(new ImageIcon((BufferedImage)sRetorno));
									exibeImagem.add(imagem,BorderLayout.CENTER);
									exibeImagem.pack();
									exibeImagem.setLocationRelativeTo(null);
									exibeImagem.setVisible(true);
								}
								label2.setForeground(Color.GREEN);
								labels.add(label2);
								log.add(label2);
								labels.add(retorno );
								log.add(retorno );
								this.validate();
							}else{
								JLabel label2 = new JLabel("\tCommand not received");
								label2.setForeground(Color.RED);
								labels.add(label2);
								log.add(label2);
							}
					}else{
						enviarComando(comando);
						System.exit(0);
					}
				}else{
					if(commandLine.getText()=="reconect" || commandLine.getText()=="rc"){
						conected = conect();
					}else{
						JLabel erro = new JLabel("The server is not available");
						erro.setForeground(Color.RED);
						labels.add(erro);
						log.add(erro);
						this.validate();
					}
				}
			}
		}
	}
	public void keyReleased(KeyEvent arg0) {
	}
	public void keyTyped(KeyEvent arg0) {
	}
	public boolean enviarComando(String comando){
		 try {
		      //client = new Socket("127.0.0.1",12345);
			 System.out.println("enviando o comando");
				  ObjectOutputStream saida;
				      saida = new ObjectOutputStream(client.getOutputStream());
				  	  saida.writeObject(comando);
				      saida.flush();
				      ObjectInputStream Outretorno = null;
				      try{
					      Outretorno = new ObjectInputStream(client.getInputStream());
				      }catch(StreamCorruptedException e){
				    	  e.printStackTrace();
				      }
				         Object lido = Outretorno.readObject();
				         if (lido.equals("texto")) {
				        	  sRetorno = (String) Outretorno.readObject();
						      sRetorno = ((String) sRetorno).replace("null","");
						      sRetorno = ((String) sRetorno).replace("<DIR>","DIR");
						      System.out.println("sRetorno = "+sRetorno);
				         }else if(lido.equals("imagem")){
				        	 sRetorno = ImageIO.read(ImageIO.createImageInputStream(Outretorno));
					     }
			  System.out.println("comando enviado");
		      return true;
		    }
		    catch(Exception e) {
		      e.printStackTrace();
		      return false;
		    }
	}
}
`

Classe Server:
`

package ui;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Server {    
   // ArrayList<PrintWriter> clientOutputStreams;
    static ServerSocket serverSock;
    /*
    public class ClienteHandler implements Runnable {
        BufferedReader reader;
        Socket sock;
        public ClienteHandler(Socket clientSocket) {
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);
            } catch(Exception ex){}
        }
        @Override
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
                    System.out.println ("Lido " + message);
                    tellEveryone(message);
                }
            } catch (Exception ex) {}
    }      
}
*/

    public void go() {
        //clientOutputStreams = new ArrayList<PrintWriter>();
        try {
            serverSock = new ServerSocket(4242);
                		 while (!serverSock.isClosed()){
                             Socket clienteSocket = null;
							try {
								clienteSocket = serverSock.accept();
							} catch (IOException e1) {
								e1.printStackTrace();
							}
                			try {
								ObjectInputStream entrada = new ObjectInputStream(clienteSocket.getInputStream()) ;
								String comando = (String) entrada.readObject();
								System.out.println("passou pela leitura");
								comando = comando.toLowerCase();
								if(comando.indexOf("command ") != -1){
									try {
									Runtime r = Runtime.getRuntime();
								          Process saida;  
								          comando = comando.replace("command ","");
								          System.out.println("Comando = "+comando);
								          saida = r.exec(comando);  
								          BufferedReader br = new BufferedReader(new InputStreamReader(saida.getInputStream()));
									      String line = null;
									      String line2 = null;
									      while ((line = br.readLine()) != null) {
									    	  System.out.println("xxxx");
									    	  	line2+=line+"<br/>";
								                System.out.println(line);
									      }
								          ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
								          saidaRetorno.writeObject("texto");
										  saidaRetorno.writeObject((line2!=null) ? line2: "0");
								          saidaRetorno.flush();
								          br.close();
								          System.out.println("passou por aqui");
								          continue;
									} catch (IOException e) {
										e.printStackTrace();
									}
								}else if(comando.equals("exit")){
									clienteSocket.close();
									serverSock.close();
								}else if(comando.equals("take screenshot")){
									  try {
								            ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
								            saidaRetorno.writeObject("imagem");
								            Toolkit toolkit = Toolkit.getDefaultToolkit();
								            Dimension dimensions = toolkit.getScreenSize();
								            Robot robot = new Robot();
								            BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions));
								            ImageIO.write(screenshot,"png",saidaRetorno);
								            saidaRetorno.flush();
									        continue;
								            //saidaRetorno.writeObject(screenshot);
								            //clienteSocket.shutdownOutput();
								        } catch (AWTException e) {
								            e.printStackTrace();
								        } catch (IOException e) {
								            e.printStackTrace();
								        }
								}else if(comando.equals("webcam")){
									
								}else{
									ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
									saidaRetorno.flush();
									saidaRetorno.writeObject("command does not accept");
								}
							} catch (IOException | ClassNotFoundException e) {
								e.printStackTrace();
							}
                /*
                PrintWriter writer = new PrintWriter(clienteSocket.getOutputStream());
                clientOutputStreams.add(writer);
                Thread t = new Thread(new ClienteHandler(clienteSocket));
                t.start();
                */
            }
        } catch (Exception ex) {
    	 }   
}   
   static ArrayList<String> lista = new ArrayList<>();
   public static ArrayList<String> exibe() throws IOException {
	   			lista.add(System.getProperty("os.arch"));
	   			lista.add(System.getProperty("os.name"));
	   			lista.add(System.getProperty("os.version"));
	   			lista.add(System.getProperty("user.name"));
	   			lista.add(System.getProperty("user.home"));
              return lista;
   }
   /*
public void tellEveryone(String message) {
    Iterator<PrintWriter> it = clientOutputStreams.iterator();
    while (it.hasNext()) {
        try {
            PrintWriter writer = (PrintWriter) it.next();
            writer.println (message);
            writer.flush();
        } catch (Exception ex) {   }
} }*/ 
}`
Thallysson
Solucao aceita

Olá, eu consegui resolver meu problema, bom o código ficou horrível e eu tive que criar uma nova conexão a cada comando, bom está tudo funcionando já, se você tiver outra maneira melhor de se fazer ou qualquer coisa me fale por favor, o código é esse:
Classe MainWindows:
`

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class MainWindow extends JFrame implements KeyListener{
	
	private static final long serialVersionUID = 1L;
	static ArrayList<JLabel> labels = new ArrayList<>();
	JTextField commandLine = new JTextField();
	static JPanel log = new JPanel();
	private static Socket client;
	static boolean conected;
	private static Server m = new Server();
	Object sRetorno ;
	boolean available = true;
	private JLabel retorno = null;
	 
	MainWindow(){
		
		conected = conect();
		
		setTitle("Client");
		setLayout(new BorderLayout());
		log.setLayout(new BoxLayout(log, BoxLayout.Y_AXIS));
		log.setBackground(Color.BLACK);
		log.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		JScrollPane scroll = new JScrollPane(log);
		add(scroll,BorderLayout.CENTER);
		commandLine.addKeyListener(this);
		commandLine.setBorder(BorderFactory.createEtchedBorder(Color.GREEN,Color.BLACK));
		commandLine.setForeground(Color.GREEN);
		commandLine.setBackground(Color.BLACK);
		commandLine.setCaretColor(Color.GREEN);
		add(commandLine,BorderLayout.SOUTH);
		
		setSize(new Dimension(500,500));
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	public static void main(String[]args){
		System.out.println("entrou");
		new Thread(new Runnable(){
			public void run(){
				try {
					m.go();
				} catch (Exception e) {
					e.printStackTrace();
				}	
			}
		}).start();
		System.out.println("passou");
		//conected = conect();
		new MainWindow();
	}
	public boolean conect(){
		try {
			try{
				client = new Socket("127.0.0.1",4242);
			}catch(ConnectException e){
				JLabel erro = new JLabel("The server is not available");
				erro.setForeground(Color.RED);
				labels.add(erro);
				log.add(erro);
				this.validate();
				available = false;
			}
			if(available){
				System.out.println("conectou...");
				
				ArrayList<String> informacoes = m.exibe();
				String arc = informacoes.get(0);
				System.out.println(arc);
				String osName = informacoes.get(1);
				System.out.println(osName);
				String osVersion = informacoes.get(2);
				System.out.println(osVersion);
				String userName = informacoes.get(3);
				System.out.println(userName);
				String userHome = informacoes.get(4);
				System.out.println(userHome);
				JLabel start = new JLabel("<html>Start conecion with server<br/>"
										 + "systemArc: "+arc+"<br/>"
										 + "osName: "+osName+"<br/>"
										 + "osVersion: "+osVersion+"<br/>"
										 + "userName: "+userName+"<br/>"
										 + "userHome: "+userHome+"<br/></html>");
				start.setForeground(Color.GREEN);
				labels.add(start);
				log.add(start);
				this.validate();
				return true;
			}else{
				return false;
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	public void keyPressed(KeyEvent evento) {
		if(evento.getSource()==commandLine && evento.getKeyCode()==KeyEvent.VK_ENTER){
			final String comando = commandLine.getText();
			commandLine.setText("");
			if(comando!=""){
				if(available){
					final String exit = comando.toLowerCase();
					System.out.println("exit: "+exit);
					if(!exit.equals("exit")){
						System.out.println("iniciado o processo de envio do comando");
						JLabel label = new JLabel("Client comand: "+comando);
						label.setForeground(Color.GREEN);
						labels.add(label);
						log.add(label);
						this.validate();
						final boolean resultado = enviarComando(comando);
							if(resultado){
								System.out.println("----------------");
								JLabel label2 = new JLabel("\tCommand received");
								if(sRetorno instanceof String){
									if(sRetorno.equals("command does not accept")){
										retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned:</font><br/><font color=red>"+sRetorno+"</font></html>");
									}else{
										retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned: "+sRetorno+"</font></html>");
									}
								}else if(sRetorno instanceof ImageIcon){
									retorno = new JLabel("<html><font color=rgb(0,255,0)>Returned: </font><font color=red>A image...</font></html>");
									JFrame exibeImagem = new JFrame("Screenshot");
									exibeImagem.setLayout(new BorderLayout());
									JLabel imagem = new JLabel((ImageIcon) sRetorno);
									exibeImagem.add(imagem,BorderLayout.CENTER);
									exibeImagem.pack();
									exibeImagem.setLocationRelativeTo(null);
									exibeImagem.setVisible(true);
								}
								label2.setForeground(Color.GREEN);
								labels.add(label2);
								log.add(label2);
								labels.add(retorno );
								log.add(retorno );
								this.validate();
							}else{
								JLabel label2 = new JLabel("\tCommand not received");
								label2.setForeground(Color.RED);
								labels.add(label2);
								log.add(label2);
							}
					}else{
						enviarComando(comando);
						System.exit(0);
					}
				}else{
					if(commandLine.getText()=="reconect" || commandLine.getText()=="rc"){
						conected = conect();
					}else{
						JLabel erro = new JLabel("The server is not available");
						erro.setForeground(Color.RED);
						labels.add(erro);
						log.add(erro);
						this.validate();
					}
				}
			}
		}
	}
	public void keyReleased(KeyEvent arg0) {
	}
	public void keyTyped(KeyEvent arg0) {
	}
	public boolean enviarComando(String comando){
		 try {
		      //client = new Socket("127.0.0.1",12345);
			 System.out.println("enviando o comando");
				  ObjectOutputStream saida;
				      saida = new ObjectOutputStream(client.getOutputStream());
				  	  saida.writeObject(comando);
				      saida.flush();
				      ObjectInputStream Outretorno = null;
				      try{
					      Outretorno = new ObjectInputStream(client.getInputStream());
				      }catch(StreamCorruptedException e){
				    	  e.printStackTrace();
				      }
				         Object lido = Outretorno.readObject();
				         if (lido.equals("texto")) {
				        	  sRetorno = (String) Outretorno.readObject();
						      sRetorno = ((String) sRetorno).replace("null","");
						      sRetorno = ((String) sRetorno).replace("<DIR>","DIR");
					          conected = conect();
				         }else if(lido.equals("imagem")){
				        	 sRetorno = (ImageIcon)Outretorno.readObject();
				        	 conected = conect();
					     }
			  System.out.println("comando enviado");
		      return true;
		    }
		    catch(Exception e) {
		      e.printStackTrace();
		      return false;
		    }
	}
}
`

Classe Server:
`

package ui;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamPanel;
import com.github.sarxos.webcam.WebcamResolution;

public class Server {    
   // ArrayList<PrintWriter> clientOutputStreams;
    static ServerSocket serverSock;
    /*
    public class ClienteHandler implements Runnable {
        BufferedReader reader;
        Socket sock;
        public ClienteHandler(Socket clientSocket) {
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);
            } catch(Exception ex){}
        }
        @Override
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
                    System.out.println ("Lido " + message);
                    tellEveryone(message);
                }
            } catch (Exception ex) {}
    }      
}
*/

    public void go() {
        //clientOutputStreams = new ArrayList<PrintWriter>();
        try {
            serverSock = new ServerSocket(4242);
                		 while (!serverSock.isClosed()){
                             Socket clienteSocket = null;
							try {
								clienteSocket = serverSock.accept();
							} catch (IOException e1) {
								e1.printStackTrace();
							}
                			try {
								ObjectInputStream entrada = new ObjectInputStream(clienteSocket.getInputStream()) ;
								String comando = (String) entrada.readObject();
								System.out.println("passou pela leitura");
								comando = comando.toLowerCase();
								if(comando.indexOf("command ") != -1){
									try {
									Runtime r = Runtime.getRuntime();
								          Process saida;  
								          comando = comando.replace("command ","");
								          System.out.println("Comando = "+comando);
								          saida = r.exec(comando);  
								          BufferedReader br = new BufferedReader(new InputStreamReader(saida.getInputStream()));
									      String line = null;
									      String line2 = null;
									      while ((line = br.readLine()) != null) {
									    	  System.out.println("xxxx");
									    	  	line2+=line+"<br/>";
								                System.out.println(line);
									      }
								          ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
								          saidaRetorno.writeObject("texto");
										  saidaRetorno.writeObject((line2!=null) ? line2: "0");
								          saidaRetorno.flush();
								          br.close();
								          clienteSocket.close();
								          continue;
									} catch (IOException e) {
										e.printStackTrace();
									}
								}else if(comando.equals("exit")){
									clienteSocket.close();
									serverSock.close();
								}else if(comando.equals("take screenshot")){
									  try {
								            ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
								            saidaRetorno.writeObject("imagem");
								            Toolkit toolkit = Toolkit.getDefaultToolkit();
								            Dimension dimensions = toolkit.getScreenSize();
								            Robot robot = new Robot();
								            BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions));
								            ImageIcon icone = new ImageIcon(screenshot);
								            saidaRetorno.writeObject(icone);
								            saidaRetorno.flush();
								            clienteSocket.close();
									        continue;
								            //saidaRetorno.writeObject(screenshot);
								            //clienteSocket.shutdownOutput();
								        } catch (AWTException e) {
								            e.printStackTrace();
								        } catch (IOException e) {
								            e.printStackTrace();
								        }
								}else if(comando.equals("webcam view")){
									
								}else{
									ObjectOutputStream saidaRetorno = new ObjectOutputStream(clienteSocket.getOutputStream());
									saidaRetorno.flush();
									saidaRetorno.writeObject("command does not accept");
								}
							} catch (IOException | ClassNotFoundException e) {
								e.printStackTrace();
							}
                /*
                PrintWriter writer = new PrintWriter(clienteSocket.getOutputStream());
                clientOutputStreams.add(writer);
                Thread t = new Thread(new ClienteHandler(clienteSocket));
                t.start();
                */
            }
        } catch (Exception ex) {
    	 }   
}   
   static ArrayList<String> lista = new ArrayList<>();
   public static ArrayList<String> exibe() throws IOException {
	   			lista.add(System.getProperty("os.arch"));
	   			lista.add(System.getProperty("os.name"));
	   			lista.add(System.getProperty("os.version"));
	   			lista.add(System.getProperty("user.name"));
	   			lista.add(System.getProperty("user.home"));
              return lista;
   }
   /*
public void tellEveryone(String message) {
    Iterator<PrintWriter> it = clientOutputStreams.iterator();
    while (it.hasNext()) {
        try {
            PrintWriter writer = (PrintWriter) it.next();
            writer.println (message);
            writer.flush();
        } catch (Exception ex) {   }
} }*/ 
}`

Obs: O código está completamente desorganizado pois eu estava fazendo alguns testes mas espero que de pra entender :slight_smile:

Criado 11 de julho de 2016
Ultima resposta 18 de jul. de 2016
Respostas 10
Participantes 2