Интернет Програмиране с Java
Разработка на chat клиент/сървър
Многопотребителски сървър за разговори (multi-user chat server)
Нека сега си поставим една по-сложна задача – реализация на сървър за разговори (chat server). Чрез него ще демонстрираме силата на многонишковото програмиране при разработка на мрежови приложения. Да разгледаме първо една примерна реализация на многопотребителски сървър за разговори:
public class ChatServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(5555); System.out.println("Chat server started on port " + serverSocket.getLocalPort());
ServerMsgDispatcher dispatcher = new ServerMsgDispatcher(); dispatcher.start();
while (true) { Socket clientSocket = serverSocket.accept(); ClientListener clientListener = new ClientListener(clientSocket, dispatcher); dispatcher.addClient(clientSocket); clientListener.start(); }
}
}
public ClientListener(Socket aSocket, ServerMsgDispatcher aServerMsgDispatcher) throws IOException { mSocket = aSocket; mSocketReader = new BufferedReader( new InputStreamReader( mSocket.getInputStream())); mDispatcher = aServerMsgDispatcher; }
public void run() { try { while (!isInterrupted()) { String msg = mSocketReader.readLine(); if (msg == null) break; mDispatcher.dispatchMsg(mSocket, msg); }
} catch (IOException ioex) { System.err.println("Error communicating " + "with some of the clients."); } mDispatcher.deleteClient(mSocket); }
}
class ServerMsgDispatcher extends Thread { private Vector mClients = new Vector(); private Vector mMsgQueue = new Vector();
public synchronized void addClient(Socket aClientSocket) { mClients.add(aClientSocket); }
public synchronized void deleteClient(Socket aClientSock) { int i = mClients.indexOf(aClientSock); if (i != -1) { mClients.removeElementAt(i); try { aClientSock.close(); } catch (IOException ioe) { // Probably the socket already is closed }
}
}
public synchronized void dispatchMsg( Socket aSocket, String aMsg) { String IP = aSocket.getInetAddress().getHostAddress(); String port = "" + aSocket.getPort(); aMsg = IP + ":" + port + " : " + aMsg + "nr"; mMsgQueue.add(aMsg); notify(); }