Servidor Socket Java

Bom é o seguinte já tenho o cliente python ele está perfeito porém quero controla-lo com uma interface grafica em java gostaria de saber como enviar comandos para esse meu cliente ele tem varias opções como mexer na shell do outro pc tirar prints dentre outras funcionalidades então resumindo eu gostaria de enviar varios comandos a esse cliente é assim poder controlar meu pc por outro ou varios pc´s o servidor deverá enviar bytes para que o cliente receba converta para string é assim execute o comando desejado eu já tentei de varias formas criar esté servidor cheguei até aenviar comandos mais ai se eu por exemplo quiser logar como root na minha shell e mandar ele executar sudo su quando a shell pedir a senha que vc digitar na interface java ele da o seguinte erro java.net.BindException: endereço ja em usa (Bind Failed)

Gostaria de achar uma luz no fim tunel XD kkk

Camarada, preciso de mais informações para te dar uma ajuda exata. Mas o básico seria:

No java, vc vai usar a classe socket, especificando o ip e a porta da cliente (que na verdade é um server socket que o cliente está executando).

Então no socket java, você vai usar o método write(“string”.getBytes())

Escrevi pelo celular, então desculpa se não ficou muito claro.

Posta o stacktrace e manda mais detalhes como endereços, portas e o comando que quer enviar

Abs

descupe-me se não fui claro eu tenho um cliente python quando ele é executado ele fica esperando comandos do servidor java o servidor tem interface grafica e varias opções tipo mandar comandos para o bot executar na shell no pc cliente fazer upload do servidor para o cliente etc… tem varias outras funcionalidades o que está acontecendo é o seguinte vou dar um exemplo aqui tenho a seguinte classe

package Controle;

import Modelo.ModeloShellReverse;
import Modelo.ModelosDDos;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;


public class ControleShellReverse {
     final int porta = 9999;
    ServerSocket servidor;
    Socket socketCliente;
    Modelo.ModelosDDos mod = new ModelosDDos();
    DataOutputStream envia;
    OutputStream msgCli;
    //abre a shell
    //executa os comandos na shell
    public void executa(ModeloShellReverse mod){
        try {
            System.out.println("Inicializando servidor");
            System.out.println("Esperando conexões!");
             servidor = new ServerSocket(porta); 
                for (int clientes = 0; clientes < 3; clientes++) {
                      socketCliente = servidor.accept();
                       msgCli = socketCliente.getOutputStream();
                        
                        envia = new DataOutputStream(msgCli);
                        byte[] a = mod.getComando();
                        byte[] b = mod.getExecuta();
                        envia.write(a);
                        envia.write(b);
                        envia.flush();
                }
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "ERRO: \n " + ex);
        }
    }
    
    
    public void sair(ModeloShellReverse mod){
        try {
            System.out.println("Inicializando servidor");
            System.out.println("Esperando conexões!");
                        msgCli = socketCliente.getOutputStream();
                        byte[] a = mod.getCancelar();
                        msgCli.write(a);
                        msgCli.flush();
                        socketCliente.close();
                   
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "ERRO: \n " + ex);
        }
    }
    
}

ela e responsavel para por mandar comandos para o bot quando chamada pela interface grafica assim como as outras clsses mais resolvendo uma já passa para outra porém ela só e executada uma vez se eu for tentar mandar mais comandos ela da esse erro que falei por exemplo se eu quiser navegar na minha shell usando cd /home é etc… não iria dar porque da esté erro

java.net.BindException: endereço ja em usa (Bind Failed)

já tentei usar servidor.close(); e nada a porta usada é a 9999 é uma coisa bem simples acho que estou deixando passar algo haha
usei modelo mvc para facilitar possiveis manutenções queria uma forma de deixar a conexão ativa e mandar comandos sem que de algum tipo de erro algo simples mais funcional se poder ajudar ficarei grato

Você sempre está criando um novo ServerSocket e na mesma porta.

Acredito que esse ServerSocket deveria ser instanciado no construtor da classe ControleShellReverse e não no método executa.

vamos la

a JVM abstrai determinadas coisas, mas vc precisa entender como sockets, e em especial como a implementação de sockets/network/redes/tcp/ip no sistema operacional funciona.

vc pode imaginar que sockets são arquivos, pq vc tem a mesma semantica de ler e escrever ( porem vc nao consegue dar um “seek” ).

o normal é um socket estar escutanto em uma interface de rede e uma porta. se dois sockets estiver na mesma porta, quando vc enviar, quem vai ler? entendeu o problema?

alguns sistemas operacionais tem o recurso de REUSO de porta. assim o sistema operacional age como um load balancer. se 2 programas estiverem ouvindo na mesma porta com a opção de REUSO, metade das conexões vão pra A e metade vão pra B. uma vez estabelecido a conexão não tem perigo da informação ir pro processo errado.

se vc não tem motivos pra dar bind mais de uma vez na mesma porta, então preste atenção no ciclo de vida dos seus objetos. vc pode conectar mil coisas em uma porta, mas dar bind, ou seja, receber a conexão, deveria ser uma vez só. isso é mais especial.

pense nisso e olhe seu codigo. veja o que é especial ( dar bind, levantar seu servidor ) do que é comum

btw se vc tem curiosidade, procure o metodo setReuseAddress mas o seu problema é outro aparentemente

Eu percebi que estava criando outros sockets cada vez que era executado esse é o problema queria poder criar o socket quando a interface for inicializada é assim então poder enviar comandos atraves deste socket já criado obrigado staroski é peczenyj irei pesquisar sobre o metodo setReuseAddress vlw abraços amigo!!