Мой сервер перестает работать при чтении .accept (), используя Sockets - PullRequest
0 голосов
/ 09 февраля 2012

прошу прощения за ошибки в написании ... Я использую NetBeans для запуска домашнего сервера и клиента, и все работает нормально. Как я уже говорил ранее, я использую «Socket» на моем клиенте и «ServerSocket» на моем SV. Я также использую JDBC Mysql на сервере. Проблема начинается, когда я генерирую оба java-файла в их распространяемых папках и использую их. Клиент отправляет информацию на сервер (он начинается с .getOutputStream () и .getInputStream (), затем .flush ()), но сервер не получает никакого сообщения. Я пытался увидеть, где это останавливается, и это в

клиентов [i] = новый клиент (сервер. accept () , i);

Сумасшедшая вещь случается, когда я пытаюсь запустить свой сервер из NetBeans и клиент с моего рабочего стола ... Это работает! Таким образом, сервер должен быть проблемой. Я также использую открытый порт UDP и ищу IP-адрес сервера на 192.168.0.10 (это мой компьютер в локальной сети).

Надеюсь, кто-нибудь может мне помочь, заранее спасибо!


Здесь я вставляю свой код, извините, некоторые переменные написаны на испанском:

public ServidorMultiCliente () { супер ("Servidor MultiCliente"); initComponents ();

    try{
        servidor = new ServerSocket( 500, maxNumberClients);
    }catch(IOException excepcion){
        excepcion.printStackTrace();
        System.exit(1);
    }

    serverWriteBox.append("Server iniciated, waiting for connections..."); }

Я запускаю их с сервера:

public void ejecutar () { clientsAcceptor.start (); messagesListener.start (); }

Где clientAcceptor:

частный класс aceptadorClientes extends Thread {

    public void run(){
        for( int i = 1; i < maxNumberClients; i++ ){
        try{
            clientes[i] = new Cliente (servidor.accept(), i); // **Here it stops**
            // It never reaches here... (without using NetBeans)
            clientes[i].start();
            clientes[i].aceptado = true;
        }catch(IOException excepcion){
            excepcion.printStackTrace();
        }
    }

Вот так я принимаю клиентов в разных темах. Я делаю то же самое с messageListener, который является новым потоком для каждого нового клиента. Это в цикле, всегда слушаю. И здесь я вставляю свой исполняемый Клиент, который отличается от класса Cliente, который я использовал в ServidorMultiCliente:

public Cliente () { }

public Cliente(String host){
    this.host = host;
    this.executeConnection();
}

public void executeConnection(){
    int connect = 0;
    try {
        cliente = new Socket(InetAddress.getByName(host), 500);
        conectar = 1;
    } catch (IOException ex) {
        conectar = 0;
        this.ejecutarConexion();
    }

    if(conectar == 1){
        obtainFlows();
    }
}

private void receiveFlows () {

    try{
        output= new ObjectOutputStream( cliente.getOutputStream());
        output.flush(); // Here I should be "connected"

        input = new ObjectInputStream(cliente.getInputStream());
    } catch(IOException ex){
        this.initiateDisconnection();
    }
    sendFlows("I'm connected!");
    new messageListener().start(); // This is a thread
}

1 Ответ

1 голос
/ 09 февраля 2012

ServerSocket#accept - это блокирующий вызов.Он слушает порт и возвращает Socket при подключении клиента.Вы не очень хорошо демонстрируете логику своего сервера, но кажется, что вы помещаете клиентов в массив, поэтому вы, очевидно, хотите поддерживать более одного клиента.Вы не показываете, если ваш Client класс запускает поток и немедленно возвращается.

У вас должен быть серверный цикл, который просто прослушивает сокет сервера и создает клиентов после того, как он получилклиентский сокет.Даже если вы сделаете это в конструкторе Client (я не могу сказать без кода), это не очень хорошее место для этого и серьезно затрудняет отладку.

Если вы не запускаете потоки для своегоклиентам это объясняет сервер, который «останавливается» (если «останавливается» означает «блокирует», а не «вылетает»).См. «Написание серверной части сокета» в Учебном руководстве по Java для подробного объяснения.

Я не могу понять, почему он ведет себя по-другому, когда запускается через Netbeans.Требуется немного больше контекста кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...