2012-02-26 3 views
0

Сервер сокетов, указанный в шаге 3, от http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/chat-client-server.html строит чисто (версия Java версии 1.7.0_02) и работает без ошибок, но он выходит без ошибок, а не ждет, чтобы принять клиентов.Проблема с сборкой сервера Socket

Обновлено ChatServer с отсутствующим кодом агда:

ChatServer:

import java.net.*; 
import java.io.*; 

public class ChatServer implements Runnable 
{ private ServerSocket  server = null; 
    private Thread   thread = null; 
    private ChatServerThread client = null; 

    public ChatServer(int port) 
    { try 
     { System.out.println("Binding to port " + port + ", please wait ..."); 
     server = new ServerSocket(port); 
     System.out.println("Server started: " + server); 
     start(); 
     } 
     catch(IOException ioe) 
     { System.out.println(ioe); } 
    } 
    public void run() 
    { while (thread != null) 
     { try 
     { System.out.println("Waiting for a client ..."); 
      addThread(server.accept()); 
     } 
     catch(IOException ie) 
     { System.out.println("Acceptance Error: " + ie); } 
     } 
    } 
    public void addThread(Socket socket) 
    { System.out.println("Client accepted: " + socket); 
     client = new ChatServerThread(this, socket); 
     try 
     { client.open(); 
     client.start(); 
     } 
     catch(IOException ioe) 
     { System.out.println("Error opening thread: " + ioe); } 
    } 
    public void start() { 
    thread = new Thread(this); 
    thread.start(); 
} 
    public void stop()     { /* no change */ } 
    public static void main(String args[]) { 
     ChatServer server = null; 
     if (args.length != 1) 
     System.out.println("Usage: java ChatServer port"); 
     else 
     server = new ChatServer(Integer.parseInt(args[0])); 
} 
} 

ChatServerThread:

import java.net.*; 
import java.io.*; 

public class ChatServerThread extends Thread 
{ private Socket   socket = null; 
    private ChatServer  server = null; 
    private int    ID  = -1; 
    private DataInputStream streamIn = null; 

    public ChatServerThread(ChatServer _server, Socket _socket) 
    { server = _server; socket = _socket; ID = socket.getPort(); 
    } 
    public void run() 
    { System.out.println("Server Thread " + ID + " running."); 
     while (true) 
     { try 
     { System.out.println(streamIn.readUTF()); 
     } 
     catch(IOException ioe) { 
      System.out.println(ioe.getMessage()); 
     } 
     } 
    } 
    public void open() throws IOException 
    { streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
    } 
    public void close() throws IOException 
    { if (socket != null) socket.close(); 
     if (streamIn != null) streamIn.close(); 
    } 
} 
+0

'строит чисто, но не run' Can вы разрабатываете? –

+0

Да, без ошибок компиляции, при выполнении он должен порождать слушателя и ждать клиентских подключений, но он этого не делает, вместо этого он, похоже, исчезает, никаких ошибок. Шаг 1 на ссылочной странице действительно работает. – Astron

+0

Попробуйте обработать IOException в методе запуска ChatServerThread и напечатать ошибку. Если клиент закрывает сокет, у вас будет бесконечный цикл, вы бы не заметили, потому что исключение не обрабатывается. –

ответ

1

EDIT: обновление моего ответьте на рабочее решение.

Изменить эти методы в вашем ChatServer классе для того, чтобы быть похожим на этих

public void start() { 
    thread = new Thread(this); 
    thread.start(); 
} 

public void stop() { 
    // You should implement this too 
} 

public static void main(String args[]) { 
    // Instantiate a CharServer with the listening port 9191 
    ChatServer chatServer = new ChatServer(9191); 
    // CharServer.start() should not be confused with Thread.start(); 
    // This calls our custom method up above, which includes a call to 
    // Thread(ChatServer).start(); 
    chatServer.start(); 

} 

Где 9191 это номер порта, я сделал.

Выполнение CharServer метода #main производит следующий вывод и остается живым

Binding to port 9191, please wait ... 
Server started: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9191] 
Waiting for a client ... 
Waiting for a client ... 

Вы также должны реализовать stop() метод ради функциональности.

+0

Добавлен рекомендуемый код, но ошибка не возникает. – Astron

+0

@Astron Я обновил свой ответ с помощью правильного решения. Пожалуйста, проверь это. –

+0

Для вас решение я понял, что args не присутствовали в примере. Я уточню вопрос с исправленным кодом. – Astron

0
{ while (thread != null) 

Вы никогда не заходило нить, так что все будет нулевым И вы никогда не создать поток

Попробуйте изменить старт() для:

public void start()     { 
    thread = new Thread(this); 
    thread.start(); 
} 
+0

Изменил start(), как описано, те же результаты. Как установить поток, чтобы он не всегда был нулевым? – Astron

+0

Извините, опечатка там, это должно быть thread = new Thread (this); Обновил мой ответ – objects

Смежные вопросы