Chat Applet
Toplam üç sınıfımızdan biri olan chat appleti, tek grafik arayüzüne sahip sınıftır. Bu yüzden java.applet paketinin yanında java.awt sınıf paketininide kullanması gerekiyor.
import java.net.*;
import java.io.*;
import java.awt.*;
import java.applet.*;
public class chatapplet extends Applet implements Runnable
{
...
}
Chat Applet sınıfı Applet sınıfını miras alır ve Thread kullanır.
public static final int PORT = 8888;
Socket socket;
DataInputStream in;
PrintStream out;
TextField inputfield;
TextArea outputarea;
Thread thread;
PORT, socket, in und out chatserver ve baglanti da açıklanan ile aynı anlamı taşır. inputfield giriş nesnesini outputarea ise çıkış nesnesini tutuyor. thread kendine ait Thread 'i saklıyor.
public **** init()
{
inputfield = new TextField();
outputarea = new TextArea();
outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
outputarea.setEditable(false);
this.setLayout(new BorderLayout());
this.add("South", inputfield);
this.add("Center", outputarea);
this.setBackground(Color.lightGray);
this.setForeground(Color.black);
inputfield.setBackground(Color.white);
outputarea.setBackground(Color.white);
}
Init metodunda grafik arayüz hazırlanıyor. Giriş sahası (Textfield) ve çıkış sahası (Textarea) oluşturulup, giriş sahası aşağıya gelecek şekilde yerleştiriliyor. Bunun akabinde renkler belirleniyor.
public **** start()
{
try
{
socket = new Socket(this.getCodeBase().getHost(), PORT);
in = new DataInputStream(socket.getInputStream());
out = new PrintStream(socket.getOutputStream());
} catch (IOException e)
{
this.showStatus(e.toString());
say("Server ile bağlantı kurulamadı!");
System.exit(1);
}
say("Server ile bağlantı kuruldu...");
if (thread == null)
{
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
}
Start metodunda applet server ile bağlantı kurulmaya çalışılıyor. Gerekli olan server adresi HTML dökümanı tarafından belirleniyor. Bu da daima HTML dökümanın bulunduğu serverın adresidir. Başka serverlar ile bağlantıya izin verilmediği için, başka server olmasınında hiç bir anlamı yok. Hata oluşursa veya bağlantı kurulursa, sonuç bir mesaj ile kullanıcıya bildiriliyor. Bundan sonra kendi thread 'ini oluşturup başlatıyor.
public **** stop()
{
try
{
socket.close();
} catch (IOException e)
{
this.showStatus(e.toString());
}
if ((thread !=null) && thread.isAlive())
{
thread.stop();
thread = null;
}
}
Stop Metodu browser tarafıdan, kullanıcı sayfayı terk ettiği zaman otomatik olarak çağrılır. Socket kapatılıyor ve thread durduruluyor.
public **** run()
{
String satir;
try
{
while(true)
{
satir = in.readLine();
if(satir!=null)
outputarea.appendText(satir+'
' );
}
} catch (IOException e) { say("Server ile bağlantı kesildi."); }
}
run metodunda sonsuz bir dögü içinde giriş sahasından girilen mesajlar, çıkış sahasında gösteriliyor.
public boolean action(Event e, Object what)
{
if (e.target==inputfield)
{
String inp=(String) e.arg;
out.println(inp);
inputfield.setText("");
return true;
}
return false;
}
Event Metodu kullanıcı giriş yaptığında aktif olur. Kullanıcının giriş sahasına girip girmediğini kontrol ediyoruz. Bu taktirde girileni alıp servera gönderiyoruz. Giriş sahasını tekrar boşaltıyoruz.
public **** say(String msg)
{
outputarea.appendText("*** "+msg+" ***
");
}
Say Metodu girilen mesajı başına ve sonuna yıldız ekleyerek gösteriyor.
Toplam üç sınıfımızdan biri olan chat appleti, tek grafik arayüzüne sahip sınıftır. Bu yüzden java.applet paketinin yanında java.awt sınıf paketininide kullanması gerekiyor.
import java.net.*;
import java.io.*;
import java.awt.*;
import java.applet.*;
public class chatapplet extends Applet implements Runnable
{
...
}
Chat Applet sınıfı Applet sınıfını miras alır ve Thread kullanır.
public static final int PORT = 8888;
Socket socket;
DataInputStream in;
PrintStream out;
TextField inputfield;
TextArea outputarea;
Thread thread;
PORT, socket, in und out chatserver ve baglanti da açıklanan ile aynı anlamı taşır. inputfield giriş nesnesini outputarea ise çıkış nesnesini tutuyor. thread kendine ait Thread 'i saklıyor.
public **** init()
{
inputfield = new TextField();
outputarea = new TextArea();
outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
outputarea.setEditable(false);
this.setLayout(new BorderLayout());
this.add("South", inputfield);
this.add("Center", outputarea);
this.setBackground(Color.lightGray);
this.setForeground(Color.black);
inputfield.setBackground(Color.white);
outputarea.setBackground(Color.white);
}
Init metodunda grafik arayüz hazırlanıyor. Giriş sahası (Textfield) ve çıkış sahası (Textarea) oluşturulup, giriş sahası aşağıya gelecek şekilde yerleştiriliyor. Bunun akabinde renkler belirleniyor.
public **** start()
{
try
{
socket = new Socket(this.getCodeBase().getHost(), PORT);
in = new DataInputStream(socket.getInputStream());
out = new PrintStream(socket.getOutputStream());
} catch (IOException e)
{
this.showStatus(e.toString());
say("Server ile bağlantı kurulamadı!");
System.exit(1);
}
say("Server ile bağlantı kuruldu...");
if (thread == null)
{
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
}
Start metodunda applet server ile bağlantı kurulmaya çalışılıyor. Gerekli olan server adresi HTML dökümanı tarafından belirleniyor. Bu da daima HTML dökümanın bulunduğu serverın adresidir. Başka serverlar ile bağlantıya izin verilmediği için, başka server olmasınında hiç bir anlamı yok. Hata oluşursa veya bağlantı kurulursa, sonuç bir mesaj ile kullanıcıya bildiriliyor. Bundan sonra kendi thread 'ini oluşturup başlatıyor.
public **** stop()
{
try
{
socket.close();
} catch (IOException e)
{
this.showStatus(e.toString());
}
if ((thread !=null) && thread.isAlive())
{
thread.stop();
thread = null;
}
}
Stop Metodu browser tarafıdan, kullanıcı sayfayı terk ettiği zaman otomatik olarak çağrılır. Socket kapatılıyor ve thread durduruluyor.
public **** run()
{
String satir;
try
{
while(true)
{
satir = in.readLine();
if(satir!=null)
outputarea.appendText(satir+'
' );
}
} catch (IOException e) { say("Server ile bağlantı kesildi."); }
}
run metodunda sonsuz bir dögü içinde giriş sahasından girilen mesajlar, çıkış sahasında gösteriliyor.
public boolean action(Event e, Object what)
{
if (e.target==inputfield)
{
String inp=(String) e.arg;
out.println(inp);
inputfield.setText("");
return true;
}
return false;
}
Event Metodu kullanıcı giriş yaptığında aktif olur. Kullanıcının giriş sahasına girip girmediğini kontrol ediyoruz. Bu taktirde girileni alıp servera gönderiyoruz. Giriş sahasını tekrar boşaltıyoruz.
public **** say(String msg)
{
outputarea.appendText("*** "+msg+" ***
");
}
Say Metodu girilen mesajı başına ve sonuna yıldız ekleyerek gösteriyor.