Модель клиент / сервер Java - PullRequest
0 голосов
/ 24 марта 2012

У меня есть класс сервера, который подключает клиента к определенному порту сокета сервера и запускает поток с классом обслуживания. В частности, у меня есть 3 класса обслуживания, поэтому я хотел бы иметь 3 разных порта. Это, однако, не работает, как я ожидал. Это мой код для сервера:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;

public class WebsiteServer {

    public static void main(String args[]) throws IOException {

        ServerSocket serversocket = new ServerSocket(22401);
        ServerSocket serversocket2 = new ServerSocket(22402);
        Thread thread;
        Thread thread2;
        Socket socket;
        Socket socket2;
        NewUserService newuserservice;
        ExistingUserService existinguserservice;

        System.out.println("Waiting for clients to connect.");

        while (true) {

            socket = serversocket.accept();
            socket2 = serversocket2.accept();

            if(socket.isConnected()) {

                System.out.println("NewUserClient has connected.");
                newuserservice = new NewUserService(socket);
                thread = new Thread(newuserservice);
                thread.start();
            }

            if(socket2.isConnected()) {

                System.out.println("ExistingUserClient has connected.");
                existinguserservice = new ExistingUserService(socket2);
                thread2 = new Thread(existinguserservice);
                thread2.start();
            }
        }
    }
}

Работает нормально, если я использую только один порт, например:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;

public class WebsiteServer {

    public static void main(String args[]) throws IOException {

        ServerSocket serversocket = new ServerSocket(22401);
        ServerSocket serversocket2 = new ServerSocket(22402);
        Thread thread;
        Thread thread2;
        Socket socket;
        Socket socket2;
        NewUserService newuserservice;
        ExistingUserService existinguserservice;

        System.out.println("Waiting for clients to connect.");

        while (true) {

            socket = serversocket.accept();
            //socket2 = serversocket2.accept();

            if(socket.isConnected()) {

                System.out.println("NewUserClient has connected.");
                newuserservice = new NewUserService(socket);
                thread = new Thread(newuserservice);
                thread.start();
            }

//            if(socket2.isConnected()) {
//                
//                System.out.println("ExistingUserClient has connected.");
//                existinguserservice = new ExistingUserService(socket2);
//                thread2 = new Thread(existinguserservice);
//                thread2.start();
//            }
        }
    }
}

Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 24 марта 2012

accept() - это метод блокировки.Другими словами, второй accept() ожидает другого соединения.Untik второе соединение принято, ваш код будет заблокирован

1 голос
/ 24 марта 2012

Метод accept блокируется, пока не будет установлено соединение.Таким образом, вы заблокированы одним .accept (), хотя на другом сервере может быть активность.Одним простым решением было бы создать по одному прослушивающему потоку на сервер.

0 голосов
/ 24 марта 2012

Вам необходимо вызвать метод accept() в отдельном потоке.accept() блокирует поток, пока кто-то не присоединится к серверу.Это может быть 1 мс или 1 год.

Я предлагаю вам создать AcceptListener, который будет вызываться, когда кто-то присоединится

public interface AcceptListener{
    public void socketAccepted(Socket s);
}

И класс обработчика

public class MyServerSocket extends Thread{
    private AcceptListener l;
    private boolean run = true;
    private ServerSocket s;
    public MyServerSocket(AcceptListener l, int port){
        this.l = l;
        this.s = new ServerSocket(port);
        this.start();
    }
    public void run(){
        while(run){
            l.socketAccepted(s.accept());
        }
    }
}

ВыВам придется обрабатывать ошибки и все такое, и делать переопределения в подклассе (ах) AcceptListener.

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