* Задача от упражнение 5, 2011г.
Публикувано на 13 ноември 2011 в раздел ПИК3 Java.
Да се направят конзолни приложения за чат-сървър и чат-клиент.
Примерно решение:
chatserver/Server.java:
package chatserver; import java.io.IOException; import java.io.DataOutputStream; import java.net.Socket; import java.util.ArrayList; public class Server{ private static int port = 1234; private static ArrayList<Socket> clients = new ArrayList<Socket>(10); public static void main(String[] args){ ServerListener s = null; try{ s = new ServerListener(port); } catch(IOException e){ System.out.println("Не може да се отвори ServerSocket на порт: "+port); return; } while(true){ try{ Socket clientSocket = s.acceptConnection(); clients.add(clientSocket); new ServerThread(clientSocket); } catch(IOException e){ System.out.println("Неуспешно свързване на клиент..."); } } } static void sendToAll(String message){ synchronized(clients){ for(int i=0; i<clients.size(); i++){ try{ DataOutputStream cos = new DataOutputStream(clients.get(i).getOutputStream()); cos.writeUTF(message); cos.flush(); } catch(IOException e){ System.out.println("Не мога да изпратя съобщение..."); } } } } static void removeClient(Socket c){ synchronized(clients){ System.out.println("Премахвам клиент "+c); clients.remove(clients.indexOf(c)); try{ c.close(); } catch(IOException e){ System.out.println("Не мога да затворя връзка с клиент"); } } } }
chatserver/ServerListener.java:
package chatserver; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerListener{ private ServerSocket servSock; public ServerListener(int port) throws IOException{ servSock = new ServerSocket(port); System.out.println("Сървърът е стартиран и слуша на порт: "+port); } public Socket acceptConnection() throws IOException{ Socket s = this.servSock.accept(); System.out.println("Нов клиент "+s.toString()); return s; } }
chatserver/ServerThread.java:
package chatserver; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class ServerThread extends Thread{ private Socket sock; DataOutputStream os; public ServerThread(Socket sock){ this.sock = sock; this.start(); } public void run(){ DataInputStream in; String message; try{ in = new DataInputStream(this.sock.getInputStream()); while(true){ message = in.readUTF(); if(message.equals("BYE")){ break; } else{ System.out.println(message); Server.sendToAll(message); } } } catch(IOException e){ System.out.println("Проблем с предаване на данни до "+this.sock.toString()); } finally{ Server.removeClient(this.sock); } } }
chatclient/Client.java:
package chatclient; import java.util.Scanner; import java.io.IOException; public class Client{ public static void main(String[] args){ String host = "localhost"; int port = 1234; String name = "Петър"; Scanner keyboardIn = new Scanner(System.in); ClientThread c = new ClientThread(host, port); String messageOut; while(true){ messageOut = keyboardIn.nextLine(); if(messageOut.equalsIgnoreCase("exit")){ c.sendMessage("BYE"); c.interrupt(); break; } else c.sendMessage(name+" каза: "+messageOut); } try{ c.close(); System.out.println("Успешен изход от системата"); } catch(Exception e){ System.out.println("Проблем при прекратяването на връзка"); } } }
chatclient/ClientThread.java:
package chatclient; import java.net.Socket; import java.io.DataOutputStream; import java.io.DataInputStream; import java.io.IOException; public class ClientThread extends Thread{ private Socket socket; private DataOutputStream out; private DataInputStream in; public ClientThread(String host, int port){ try { this.socket = new Socket(host, port); System.out.println("Свързах се с "+socket); this.in = new DataInputStream(this.socket.getInputStream()); this.out = new DataOutputStream(this.socket.getOutputStream()); // Стартиране на нишката, която очаква получаване на съобщения this.start(); } catch(IOException e){ System.out.println("Не мога да се свържа със сървъра"); } } public void run(){ try{ while(true){ System.out.println(this.in.readUTF()); } } catch(IOException e){ System.out.println("Прекратяване на нишката поради невъзможност за четене"); this.interrupt(); } } void sendMessage(String message){ try{ this.out.writeUTF(message); this.out.flush(); } catch(IOException e){ System.out.println("Не мога да изпратя съобщението"); } } void close() throws IOException{ if(this.in!=null) in.close(); if(this.out!=null) out.close(); if(this.socket!=null) socket.close(); } }
Допълнителна задача: Реализирайте функционалност за предаване на лични съобщения между различни потребители. За целта запазете имената на клиентите и на сървъра и когато например някой клиент подаде съобщение от типа "/msg Petar abcdefg", то на потребител с име "Petar" ще бъде подадено съобщението "abcdefg" (вместо да бъде разпратен целия String на всички).
Добави коментар