Джава;пытаясь создать сервер, который принимает несколько клиентских подключений - PullRequest
1 голос
/ 04 марта 2012

Недавно я пытался установить соединение между сервером и клиентом. Я смог установить соединение 1 на 1 без проблем, но сейчас я пытаюсь создать сервер, который принимает несколько клиентов, и у меня возникает проблема, когда я не могу заставить сервер прослушивать соединения, пока есть один установил ... Я не уверен, что я ясно дал понять, но вот мой код:

-Основной цикл, ожидающий соединения:

public class ChatMultiServer {

public static void main(String []args){

    int socknum = 124;
    ServerSocket serverSocket;
    Socket clientSocket;

    while(true){

    ////opens socket
    try{
        System.out.println("Opening port...");
        new ServerSocket(124).close();
        serverSocket = new ServerSocket(socknum);
    }catch(Exception e){System.out.println("Error 101 = failed to bind to port "+socknum+"."); break;}
    //////accepts connection
    try{
        System.out.println("Waiting for connections...");
        clientSocket = serverSocket.accept();
    }catch(Exception e){System.out.println("Error 102 = failed to accept port "+socknum+"."); break;}
    /////
    try{
        System.out.println("Initializing thread...");
        new Thread(new CMSThread(clientSocket));
    }catch(Exception e){System.out.println("Error 103 = failed to create thread."); break;}
    try{
        serverSocket.close();
    }catch(Exception e){System.out.println("Error 105 = failed to close socket.");}
    }
}

}

-Нить, которая обрабатывает соединения:

public class CMSThread extends Thread{
Socket socket;
BufferedReader in;
PrintWriter out;
String username;
char EOF = (char)0x00;
public CMSThread(Socket s){
    socket = s;
    run();
}
public void run(){
    try{
    System.out.println("Setting up streams...");
    in = (new BufferedReader(new InputStreamReader(socket.getInputStream())));
    out = new PrintWriter(socket.getOutputStream());
    }catch(Exception e){System.out.println("Error 204 = failed to get streams");}
    try{
        out.print("Welcome! you can quit at any tyme by writing EXIT.\nLet me introduce myself, I'm 'testprogram 1', but that doesn't really matter since you'll do the talking.\nWhat's your name?"+EOF);
        out.flush();
        username = in.readLine();
        out.print("<b>"+username+"</b>, that's a nice name.\nWell, i'll shut up now. Have fun talking to yourself while whoever is running the server observes your conversation.\n"+EOF);
        out.flush();    
    }catch(Exception e){System.out.println("Are you effin kidding me!? -.-   whatever... Error 666 = failed to chat.");}
}

}

Моя проблема, опять же, заключается в том, что, когда сервер получает соединение с клиентом (я использую ActionScript для клиентов только потому, что сделать GUI проще), он просто ждет, пока поток завершит свою работу, чтобы запустить петля снова. Я пытаюсь сделать его зацикленным в то время, когда поток обрабатывает чат.

Я подумал, что, может быть, мне нужно создать поток для цикла, а также поток для обработки соединения, но я не уверен относительно того, как мне это сделать ... Пожалуйста, дайте мне знать, если мой Гипотеза была несколько верной, и если бы она была правильной, было бы неплохо дать какое-то указание на ответ.

PS: извините, если мой код немного запутан или это глупый вопрос, я давно не создавал java-программы ...

1 Ответ

2 голосов
/ 04 марта 2012

На самом деле вы не запускаете новые темы - вы просто звоните run(). Насколько я вижу, это означает, что вы будете выполнять run() в главном потоке, который создает каждый объект CMSThread.

Чтобы начать тему, вы должны позвонить thread.start().

Кроме того, я не уверен, почему вы переносите свой CMSThread в другой поток - CMSThread расширяет поток, чтобы его можно было запускать самостоятельно. Нить обертки тоже не запускается.

Итак, вам нужно:

        new CMSThread(clientSocket).start();

и удалите вызов run() из конструктора CMSThread

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