C, PHP, VB, .NET

Дневникът на Филип Петров


* Задача от упражнение 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 на всички).

 



Добави коментар

Адресът на електронната поща няма да се публикува


*