Sayfalar

6 Mart 2016 Pazar

Basic Java multithreaded chat Server / Telnet Client

//Main.java
//Created with Netbeans!
//Netbeans ile oluşturuldu.

//if i can find time, i ll post explanations.
//Eğer zaman bulabilirsem açıklamalarını yazacağım.
//Not: there s a homework to you! Make your own version with GUI :) Use swing library ;)
//Not: Size ödev! Arayüzlü ( GUI ) versiyonunu kendiniz yazın. Swing kütüphanesini kullanın ;)
//use telnet for client
//run -> telnet ->open localhost 9000

//client için telnet kullanın
//çalıştır -> telnet ->open localhost 9000

public class Main {

   

    public static void main(String[] args) {

        MainServer m = new MainServer();

    }

}




//MainServer.java



import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Vector;

import java.util.logging.Level;

import java.util.logging.Logger;



public class MainServer extends Thread{

   

    private ServerSocket ss;

    private Socket sock;

    private Vector<ServerThread> v = new Vector<ServerThread>();

    private ServerThread t;

   

    public MainServer(){

        this.start();

    };

   

    public void run(){

        try {

            this.ss = new ServerSocket(9000);

            System.out.println("ServerSocket Started");

            Pinger p = new Pinger(this);

            p.start();

           

            while(true){

                this.sock = ss.accept();

                this.t = new ServerThread(this.sock,this);

                this.t.start();

                this.v.add(this.t);

                System.out.println("New Connection accepted vector size:"+this.v.size()+"-index:"+this.v.indexOf(this.t));

            }

        } catch (IOException ex0) {

            Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex0);

            try {

                this.sock.close();

            } catch (IOException ex2) {

                Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex2);

            }

        }finally{

            try {

                this.ss.close();

            } catch (IOException ex3) {

                Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex3);

            }

        }

    }

   

    public void sendAll(String str) {

        System.out.println(str);

        for(int i=0;i<this.v.size();i++){

            this.v.get(i).out(str);

        }

    }

   

    public void sendMe(String nick, String str){

        System.out.println("<" + nick + ">" + str);

    }

   

    public void sendAll(String nick, String str){

        System.out.println("<" + nick + ">" + str);

        for(int i=0;i<this.v.size();i++){

            if(this.v.get(i).getNick()!=nick){

                this.v.get(i).out(nick,str);

            }

        }

    }

   

    public void Ping(){

        for(int i=0;i<this.v.size();i++){

            this.v.get(i).Pong();

        }

    }



    public String listClients() {

        return this.v.size()+"";

    }



    void Pong(ServerThread aThis,String n, boolean a, boolean b, boolean c, boolean d) {

        if(this.v.contains(aThis)){

            if(b){

                this.v.remove(aThis);

                System.out.println(n + " closed connection.");

            }else{

                System.out.println(n + " Pong!");

                //System.out.println(this.v.lastIndexOf(aThis)+" ok! " + n + " " + a + "," + b + "," + c + "," + d);

            }

        }else{
            //:)
            System.out.println("You must kill " + n + " " + a + "," + b + "," + c + "," + d);

        }

    }



}



//ServerThread.java



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.logging.Level;

import java.util.logging.Logger;



public class ServerThread extends Thread{

   

    private Socket clientSocket;

    private String inMsg;

    private MainServer ms;

    private String nickname;

    private BufferedReader inStream;

    private PrintWriter outStream;

   

    public ServerThread(Socket s, MainServer x){

        this.clientSocket = s;

        this.ms = x;

        Nickname n = new Nickname();

        n.CreateUid();

        this.nickname = n.getUid();

    }

   

    public void run(){

        try {

            this.inStream = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            this.ms.sendAll(this.nickname + " has connected at adress: "+this.clientSocket.getRemoteSocketAddress());

            out("for change nick use /n nick command. Default nickname is: "+this.nickname);           

            while((this.inMsg = this.inStream.readLine()) != null) {

                if(!this.inMsg.equals("")){

                    if(checkin(this.inMsg)){

           

                    }else{

                        this.ms.sendAll(this.nickname,this.inMsg);

                    }

                }

            }

        } catch (IOException ex3) {

            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex3);

        }finally{

            try {

                this.inStream.close();

                this.clientSocket.close();

            } catch (IOException ex4) {

                Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex4);

            }

        }

    }

   

    public void out(String s2){

        try {

            this.outStream = new PrintWriter(new OutputStreamWriter(this.clientSocket.getOutputStream()));

            this.outStream.println(s2);

            this.outStream.flush();

        } catch (IOException ex5) {

            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex5);

        }

    }

   

    public void out(String n,String s2){

        try {

            this.outStream = new PrintWriter(new OutputStreamWriter(this.clientSocket.getOutputStream()));

            this.outStream.println("<"+n+">"+s2);

            this.outStream.flush();

        } catch (IOException ex5) {

            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex5);

        }

    }

   

    public boolean checkin(String s){

        if(s.startsWith("/n")){

                String[] parts = s.split(" ");

                this.ms.sendMe(this.nickname, "/n");

                this.ms.sendAll("Client <" + nickname + "> changes nickname to " + "<" + parts[1] + ">");

                nickname = parts[1];

                return true;

        }else if(s.startsWith("/list")){

            out(this.ms.listClients());

            this.ms.sendMe(this.nickname, "/list");

            return true;

        }else{

            return false;

        }

    }

   

    public String getNick(){

        return this.nickname;

    }



    public void Pong() {

        this.ms.Pong(this,this.nickname,this.clientSocket.isConnected(),this.clientSocket.isClosed(),this.clientSocket.isInputShutdown(),this.clientSocket.isOutputShutdown());

    }

}

//Nickname.java
import java.util.Date;
import java.util.Random;
public class Nickname {
    private String uqNick;
    private String uid = "";
    public Nickname(){
        Random rnd = new Random();
        int r = rnd.nextInt(100);
        String s = r+"";
        this.uid=s;
    }
    
    public void CreateUid(){
        Date d = new Date();
        long a = System.nanoTime();
        int min = d.getMinutes();
        int sec = d.getSeconds();
        String ab = ""+a;
        this.uqNick = this.uid+(ab.charAt(ab.length()-2))+(ab.charAt(ab.length()-1))+min+sec+(ab.charAt(ab.length()-3));
    }
    
    public String getUid(){
        return "guest"+this.uqNick;
    }
}
//Pinger.java
import java.util.logging.Level;
import java.util.logging.Logger;
class Pinger extends Thread{
    private MainServer m;
    public Pinger(MainServer m){
        this.m = m;
    }
    
    public void run(){
        while(true){
            try {
                Thread.sleep(10000);
                m.sendMe("d'_'b", "Ping!");
                this.m.Ping();
                System.gc();
            } catch (InterruptedException ex) {
                Logger.getLogger(Pinger.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

0 yorum:

Yorum Gönder