JAVA Thread’ler ( iş parçacıkları )

JAVA Thread’ler için bir örnek


Fare ile topun üstüne gelip oyun oynayın. Bir vuruş tekniği ekleyip topa vurabilme ekleyeceğim. Şimdilik bakın bakalım nasıl olmuş…

Kod için bir resim kullandım “ball.png”, 100×100px boyutunda bir resmi aynı klasör altına koyarsanız resimli olarak gösterebilirsiniz

package kac;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.lang.management.*;
import java.lang.reflect.*;
import java.io.*;
import javax.imageio.*;
public class kac extends Thread implements Runnable{
form f;
public synchronized void run(){
while(true){
try {
this.sleep(10);
f.validate();
}
catch (Exception ex) {
ex.printStackTrace();
}

}
}
public kac(){
JFrame.setDefaultLookAndFeelDecorated(true);
this.setPriority(4);
f=new form(”kaç kaçabilirsen”,800,600);
Dimension dim=f.getSize();
Rectangle rect=f.getBounds();
Color c=new Color(120,255,100);

ImageIcon ic1=new ImageIcon(”ball.png”);
container b1=new container(ic1);
ball b1T=new ball(100,100,100,100,rect,1,10,c,b1);
f.addBall(b1);
b1T.start();

f.setVisible(true);

}
public static void main(String args[]){
kac k=new kac();
k.start();
}
}
class container extends JLabel{
double mx,my;
public container(ImageIcon ic){
super(ic);
}
public void setXY(double x,double y){
this.mx=x;
this.my=y;
}
}
class form extends JFrame{
public container b;
JPanel allBall;
public void addBall(container b){
this.b=b;
allBall.add(b);
allBall.validate();
}
public form(String title,int w,int h){
super(title);
this.setSize(w,h);
Toolkit tk=this.getToolkit();
Dimension dim=tk.getScreenSize();
int xp=(dim.width-w)/2;
int yp=(dim.height-h)/2;
this.setLocation(xp,yp);
this.setLayout(new BorderLayout());
this.initialization();
this.setResizable(false);
}
public void initialization(){
allBall=new JPanel();
allBall.setLayout(null);
this.add(allBall);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
allBall.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseMoved(MouseEvent me){
b.setXY(me.getPoint().getX(),me.getPoint().getY());
}
});
}

}
class ball extends Thread implements Runnable{
int x,y,w,h;
private int speed;
private boolean vertical,horizontal;
private Rectangle rect;
Color c;
container panel;
int sleepTime;
public ball(int x,int y,int w,int h,Rectangle rect,int speed,int sleepTime,Color c,final container panel){
this.x=x;
this.y=y;
this.w=w;
this.h=h;
this.vertical=false;
this.horizontal=false;
this.rect=rect;
this.speed=speed;
this.c=c;
this.panel=panel;
this.sleepTime=sleepTime;
this.setPriority(5);
}
public synchronized void oriantation(){
if((x)<=0){//-> left wall
this.horizontal=false;
}
if((x+this.w)>=rect.width-4){//-> right wall
this.horizontal=true;
}
if((y)<=0){//->top wall
this.vertical=false;
}
if((y+this.h)>=rect.height-28){//->bottom wall
this.vertical=true;
}

if(this.horizontal){//-> going left
this.x-=speed;
}
else{//-> going right
this.x+=speed;
}

if(this.vertical){//-> goint top
this.y-=speed;
}
else{//-> going bottom
this.y+=speed;
}
panel.setBounds(this.x,this.y,this.w,this.h);
}
public synchronized void run(){
while(true){
try {
this.sleep(sleepTime);
oriantation();
this.control();
}
catch (Exception ex) {
ex.printStackTrace();
}

}
}
public void control(){
double mx=panel.mx;
double my=panel.my;
double px=(double)x+(w/2);
double py=(double)y+(h/2);
double XX=Math.abs(mx-px);
double YY=Math.abs(my-py);
double op=(double)w/2;
double T=Math.sqrt(Math.pow(XX,2.0)+Math.pow(YY,2.0));
if(T<=op){
if(XX>YY){
horizontal=(!horizontal);
}
else if(YY>XX){
vertical=(!vertical);
}
else{
horizontal=(!horizontal);
vertical=(!vertical);
}
}

}
}

Swing Butonu

Swing Butonu


bu buton için bir listener yazmanıza gerek yok, tıklandığında istediğiniz bir metodun tetiklenmesini sağlayabilirsiniz.


import java.lang.reflect.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class myButton extends JButton implements ActionListener{
private String clickMethod=null;
private Object owner=null;
public void actionPerformed(ActionEvent ae){
try {
if(owner==null){
throw new Exception(” owner is <null>”);
}
else{
Class objectSubClassDetails=this.owner.getClass().asSubclass(this.owner.getClass());
Method clickEventMethod=objectSubClassDetails.getMethod(clickMethod,ae.getClass());
clickEventMethod.invoke(owner,ae);
}
}
catch (Exception ex) {
throw new NoSuchMethodError();
}
}
public void myButton(){
//- default constructor
}
public void setOwner(Object owner){
this.owner=owner;
}
public myButton(String text,Object owner){
super(text);
this.owner=owner;
}
public myButton(String text,int w,int h,int x,int y,Object owner){
super(text);
this.owner=owner;
this.setBounds(x,y,w,h);
}
public myButton(String text){
super(text);
}
public myButton(Icon ic){
super(ic);
}
public myButton(String text,Icon ic){
super(text,ic);
}
public myButton(String text,Icon ic,int w,int h,int x,int y,Object owner){
super(text,ic);
setBounds(x,y,w,h);
this.owner=owner;
}
public myButton(Action ac){
super(ac);
}
public void addClickEvent(String clickMethod){
this.clickMethod=clickMethod;
this.addActionListener(this);
}
public void removeClickEvent(){
this.removeActionListener(this);
}
public void tikla(ActionEvent ae){
System.out.println (”selam”);
}
}

methodu çalıştırabilmesi için metodun bulunduğu sınıfı owner parametresi olarak atayabilirsiniz. sonra yapmanız gereken tek şey addClickEvent metodu ile çalışmasını istediğiniz methodun adını parametre olarak göndermektir. belirtiğiniz sınıf içererisinde belirtiğiniz isimdeki method çalışacaktır. çalışmasını istediğiniz methodun sadece adını yazın, ve methodu oluştururken ActionEvent parametresi aldığını unutmayın. örnek aşağıdaki gibidir.

class pencere extends javax.swing.JFrame{
public pencere(String title,int w,int h){
super(title);
setSize(w,h);
java.awt.Toolkit tk=this.getToolkit();
java.awt.Dimension dim=tk.getScreenSize();
int x=(dim.width-w)/2;
int y=(dim.height-h)/2;
setLocation(x,y);
setLayout(null);
init();
}
public void init(){
myButton bt=new myButton(”tikla”,80,30,50,50,this);
bt.addClickEvent(”tiklaMethodu”);
add(bt);
}
public void tiklaMethodu(ActionEvent ae){
System.out.println (”tikladi”);
}
public static void main(String args[]){
pencere p=new pencere(”pencere”,500,400);
p.setVisible(true);
}
}

JAVA SQL Query Builder – Test 1 – SQL 2000

Sql Server 2000 için java ile geliştirilmiş bir sorgulama programı

indir

XML’i veritabanı gibi kullanmak

Önce “js2.html” sayfası

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-9″ />
<title>js1</title>
</head>
<script language=”javascript1.2″ type=”text/javascript” src=”js2.js”></script>
<body>
<table width=”300″ border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr>
<td width=”67″>name</td>
<td width=”15″>:</td>
<td width=”218″><input name=”_name” type=”text” id=”_name” /></td>
</tr>
<tr>
<td>surname</td>
<td>:</td>
<td><input name=”_surName” type=”text” id=”_surName” /></td>
</tr>
<tr>
<td>mark</td>
<td>:</td>
<td><input name=”_mark” type=”text” id=”_mark” /></td>
</tr>
<tr>
<td colspan=”3″><input name=”_first” type=”button” id=”_first” value=”|&lt;&lt;” disabled />
<input name=”_previous” type=”button” id=”_previous” value=”&lt;&lt;” disabled />
<select name=”_opt” id=”_opt”>
</select>
<input name=”_next” type=”button” id=”_next” value=”&gt;&gt;” />
<input name=”_last” type=”button” id=”_last” value=”&gt;&gt;|” />
</td>
</tr>
</table>
<p><br />
<br />
<br />
<br />
</p>
</body>
</html>

“Js2.js” dosyası

// JavaScript
var xmlObject;
var student,students;
var IDS;
var recordNumber=0;
xmlObject=new ActiveXObject(”Microsoft.XMLDom”);
xmlObject.async=false;
xmlObject.load(”xml2.xml”);
function parsingToXMLObject(){
try{
students=xmlObject.documentElement;
student=students.childNodes[0];
IDS=document.all;

IDS["_first"].onclick=firstStudent;
IDS["_last"].onclick=lastStudent;
IDS["_previous"].onclick=previousStudent;
IDS["_next"].onclick=nextStudent;
IDS["_opt"].onchange=gotoStudent;
for(var i=0;i<students.childNodes.length;i++){
var opt=new Option(i+1,i);
IDS["_opt"].options[i]=opt;
}
writeToHTMLForm();
}
catch(e){
alert(e+” method in parsingToXMLObject”);
}
}
function writeToHTMLForm(){
try{
var st=student.childNodes;
var name=st.item(0).childNodes[0].data;
var surname=st.item(1).childNodes[0].data;
var mark=st.item(2).childNodes[0].data;
IDS["_name"].value=name;
IDS["_surName"].value=surname;
IDS["_mark"].value=mark;
}
catch(e){
alert(e+” method in writeToHTMLForm”);
}
}
function nextStudent(){
student=student.nextSibling;
writeToHTMLForm();
recordNumber++;
controlRecordNumber();
}
function previousStudent(){
student=student.previousSibling;
writeToHTMLForm();
recordNumber–;
controlRecordNumber();
}
function firstStudent(){
student=students.childNodes[0];
writeToHTMLForm();
recordNumber=0;
controlRecordNumber();
}
function lastStudent(){
recordNumber=students.childNodes.length-1;
student=students.childNodes[recordNumber];
writeToHTMLForm();
controlRecordNumber();
}
function gotoStudent(){
recordNumber=parseInt(IDS["_opt"].value);
student=students.childNodes[recordNumber];
writeToHTMLForm();
controlRecordNumber();
}
function controlRecordNumber(){
if(recordNumber>=students.childNodes.length-1){
disabledOrEnabledButton(false,true);
}
else if(recordNumber<=0){
disabledOrEnabledButton(true,false);
}
else{
disabledOrEnabledButton(false,false);
}
IDS["_opt"].options[recordNumber].selected=true;
}
function disabledOrEnabledButton(b1,b2){
IDS["_first"].disabled=b1;
IDS["_previous"].disabled=b1;
IDS["_last"].disabled=b2;
IDS["_next"].disabled=b2;
}
window.onload=parsingToXMLObject;

xml dosyası “xml2.xml”

<?xml version=”1.0″ encoding=”utf-8″?>
<ogrenciler>
<ogrenci no=”1″>
<ad>Serdar</ad>
<soyad>Turkel</soyad>
<not>48</not>
</ogrenci>
<ogrenci no=”2″>
<ad>Sibel</ad>
<soyad>Turkel</soyad>
<not>88</not>
</ogrenci>
<ogrenci no=”3″>
<ad>serkan</ad>
<soyad>turkel</soyad>
<not>98</not>
</ogrenci>
<ogrenci no=”4″>
<ad>sinan</ad>
<soyad>turkel</soyad>
<not>65</not>
</ogrenci>
<ogrenci no=”5″>
<ad>tekin</ad>
<soyad>turkel</soyad>
<not>100</not>
</ogrenci>
<ogrenci no=”6″>
<ad>seker</ad>
<soyad>turkel</soyad>
<not>78</not>
</ogrenci>
</ogrenciler>

aynı klasör altında çalıştırınız.

not: kodlar Microsoft Explorer tarayıcısına göre yazılmıştır.

Java Timer – java.util.Timer – java.util.TimerTask

Java Timer – java.util.Timer – java.util.TimerTask


Çoğu zaman ihtiyacımız olan bir konu, bir çok işi aynı anda yapabilmenize olanak sağlayacak bir uygulama. bir çok iş parçacıklı uygulama


import java.util.Timer;
import java.util.TimerTask;
public class TimerExample{
public TimerExample(){
TimerTask task=new TimerTask(){
public void run(){
islem();
}
};
Timer t=new Timer();
t.schedule(task,100,100);
}
public void islem(){
System.out.println(”İslem yapildi”);
}
public static void main(String args[]){
new TimerExample();
}
}

100 milisaniye sonra başlayan ve her 100 milisaniyede bir islem metodunu çalıştıran bir uygulama.

Programlama Dili Nedir?

Programlama Dili Nedir?

Programlama dili; Bilgisayar bilimleri dâhilinde bir bilgisayarın programlanması için geliştirilen bir dildir. Bilgisayar aslında sadece donanımsal yapıdan oluşan bir elektronik cihazdır. Bilgisayarın içerisinde manyetik etki alanı tutabilen bazı donanımsal yapılar vardır ( sabit disk ). İlgili manyetik etki alanı tutabilen donanımsal yapılara, dış ortamdan manyetik alan atanabilir veya silinebilir. Bunlar tamamen elektriksel sinyaller ile gerçekleştirilir.

Manyetik etki alanlarını küçük elektrik sinyallerine dönüştüren ve bilgisayar için anlamlı bir yapıda sisteme gönderen bilgisayar içindeki çevre birimleri, manyetik alanlardan anlamlı bazı çatılar oluşturur. Bu işlemleri gerçekleştiren çeşitli donanımsal yapılar bilgisayar içerisinde mevcuttur. Aslında bilgisayarın ne yapması gerektiğini bu manyetik alanlar belirler. Her şey bu manyetik alanların nasıl doldurulduğu ile ilgilidir. İşte bu noktada ortaya yazılım dilleri çıkar.
Bilgisayarları nasıl bir manyetik alanla doldurursak, ilgili manyetik alan yığdığımız noktaya gelindiğinde yığını nasıl anlarsa o şekilde yürütecektir.
Kullanmış olduğumuz programlama dilinde yazmış olduğumuz komutun ilgili donanım kaynağında bir karşılığı bulunur. Aslında yazılım olarak yaptığımız tek şey donanım kaynaklarını kullanmaktır. Ancak yazılımcıların çoğu bunu fark etmez çünkü yazılım kendi içerisinde iki ana gruba ayrılır. Bunlardan birincisi İşletim Sistemleri ve ikincisi Uygulama Yazılımlarıdır. İşletim sistemler donanıma en temelden erişen yazılımlardır, Windows ve Linux gibi. En temelden donanım kaynaklarını kullanmak çok zordur. Bizim yapacağımız ve birçoğunun yaptığı şey kurulu bir platform üzerinde uygulamalar geliştirmektir, yani uygulama yazılımı geliştirmektir.

İşletim sistemleri donanım kaynaklarına uyumlu olmak zorundadır, nasıl ki uyumlu olmayan bir parça taktığınız zaman ilgili donanımı tanıması için bir sürücü yazılımı yüklemeniz gerekiyorsa, aynı şekilde işletim sisteminin de donanım kaynaklarına erişebilmesi ve yönetebilmesi gerekir. Bir işletim sisteminin kalitesi, donanım kaynaklarını ne kadar performanslı ve verimli yönetebildiğine bağlıdır.

Aynı şartlar altında bir uygulama yazılımı da işletim sistemine uyumlu olmak zorundadır. Eğer işletim sistemine uyumlu olmayan bir uygulama yazılımı geliştirirseniz, yazılımınız ilgili işletim sisteminde çalışmayacaktır.

Programlama dilleri ise bilgisayar içerisinde az önce bahsi geçen süreci kolaylaştıran bir tekniktir. Bilgisayar içerisindeki komutları bazı terimlerle isimlendirerek bir söz dizimi yaratılmıştır. Kendi içerisinde bir dil gibidir, kuralları, yazım sitili, işaretleri ve sıralamaları vardır. Yazılım dilleri sayesinde bilgisayara yapmasını istediğimiz bir işi satırlarca işlemler gerçekleştirerek değil de sadece tek bir komut uygulayarak da gerçekleştirebiliriz. Programlama dilleri, donanım ile insan arasında, programlama açısından bir köprü görevi üstlenir.

Programlama dillerinin kalitesi; kullanışlı, kolay ve en önemlisi problemi olabildiğince basit çözebilme yeteneğine bağlıdır. Problem büyüdükçe karmaşıklaşmamalıdır.

Java Ekran Görüntüsü

JAVA: uzak bilgisayarın ekran görüntüsünü alma

Uzak bilgisayarda çalıştıracağınız basit bir java uygulaması ile masaüstü ekran görüntüsünü doğrudan başka bir program üzerinden izleyebilirsiniz.

Bu program sadece bir uygulamadır. Program sonuçta bir trojan gibi çalışabilir, ancak uzak bilgisayarın IP’sini bilmeden ekran görüntüsünü alamazsınız, Çalıştığı bilgisayarın IP’sini standart bir domain üzerine bağlanarak bilgi vermesini isteyebilirsiniz. Ayrıca her açıldığında tekrar çalışması için Registry üzerine de kaydedebilirsiniz. bunu yaptığınız takdirde elinizde gerçek bir trojan olacaktır. çalışma sırasında port açarken güvenlik duvarı tarafından uyarı alabilirsiniz, bu tür durumları göz önünde bulundururarak çalışmanızı diliyorum.

Öncelikle uzak bilgisayarda çalıştırmanız gereken programı derlemelisiniz. bu dosyayı Jar haline getirdikten sonra uzak bilgisayarda bir defa çalıştırmanız yeterlidir.
resimgonder.java

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGEncodeParam;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

import com.sun.imageio.plugins.jpeg.JPEG;

import java.net.ServerSocket;

import java.net.Socket;

import java.io.OutputStream;

import java.awt.Toolkit;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.Dimension;

import java.awt.image.BufferedImage;

public class resimgonder extends Thread implements Runnable {

private ServerSocket server=null;

public resimgonder() {

try{

server=new ServerSocket(1222);

}

catch(Exception ex){

ex.printStackTrace();

}

}

public void run(){

try{

Robot r=new Robot();

Toolkit tk=Toolkit.getDefaultToolkit();

Dimension dim=tk.getScreenSize();

Rectangle rect=new Rectangle(dim);

while(true){

try{

Socket socket=server.accept();

OutputStream osw=socket.getOutputStream();

BufferedImage bi=r.createScreenCapture(rect);

JPEGEncodeParam enc=JPEGCodec.getDefaultJPEGEncodeParam(bi);

enc.setQuality(10,false);

JPEGImageEncoder ienc=JPEGCodec.createJPEGEncoder(osw);

ienc.encode(bi,enc);

osw.flush();

socket.close();

}

catch(Exception ex){

ex.printStackTrace();

}

}

}

catch(Exception es){

es.printStackTrace();

}

}

public static void main(String args[]){

try{

resimgonder r=new resimgonder();

r.start();

}

catch(Exception ex){

ex.printStackTrace();

}

}

}

şimdi sıra uzak bilgisayardaki görüntüyü kendi bilgisayarınıza taşımanıza geldi, programı çalıştırdığınız bilgisayarın IP’sini biliyorsanız aşağıdaki kodu çalıştırırken ilgili IP’yi yazarak görüntüyü alabilirsiniz.

Öncelikle bir resimkutusu sınıfı yaratalım

picturebox.java

import java.awt.image.BufferedImage;

public class picturebox extends javax.swing.JPanel {

public javax.swing.ImageIcon bi=null;

public void setBi(javax.swing.ImageIcon bi){

this.bi=bi;

repaint();

}

public javax.swing.ImageIcon getBi(){

return this.bi;

}

public picturebox() {

}

@Override

public void paint(java.awt.Graphics g){

if(bi!=null){

g.drawImage(bi.getImage(),0,0,this.getWidth(),this.getHeight(),this);

}

else{

g.drawString(”No Image”,5,5);

}

}

}

daha sonra resimalma işlemini yapan sınıfı yazmallıyız

resimal.java

import java.net.Socket;

import java.io.InputStream;

import javax.swing.ImageIcon;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

public class resimal extends Thread implements Runnable {

private String host=null;

private picturebox picturebox1=null;

public resimal(String host,picturebox picturebox1) {

this.host=host;

this.picturebox1=picturebox1;

}

public synchronized void run(){

while(true){

try{

Socket socket=new Socket(host,1222);

InputStream isr=socket.getInputStream();

BufferedImage bi=ImageIO.read(isr);

ImageIcon ic=new ImageIcon(bi);

picturebox1.setBi(ic);

socket.close();

}

catch(Exception ex){

ex.printStackTrace();

}

}

}

}

şimdi son uygulamamızda

Form.java
import java.net.*;

import java.io.*;

import javax.imageio.*;

import javax.swing.*;

import java.awt.*;

import java.awt.image.*;

public class Form extends javax.swing.JFrame {

private javax.swing.JButton button;

private javax.swing.JTextField IP;

private picturebox picturebox1;

public Form() {

this.setLayout(null);

button = new javax.swing.JButton(”GORUNTU IZLE”);

button.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

resimCagir(evt);

}

});

IP = new javax.swing.JTextField();

picturebox1 = new picturebox();

picturebox1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

button.setBounds(20,50,100,30);

IP.setBounds(130,50,200,30);

picturebox1.setBounds(20,50,640,480);

this.add(button);

this.add(IP);

this.add(picturebox1);

}

private void resimCagir(java.awt.event.ActionEvent evt) {

resimal r=new resimal(IP.getText(),picturebox1);

r.start();

}

public static void main(String args[]) {

Form f=new Form();

f.setSize(800,600);

f.setVisible(true);

}

}

XML

XML : Sayfanız yenilenmeden JavaScript XML ile sayfanızı değiştirmek.

Sayfanız üzerinde yapmanız gereken bir işlemi, sayfanız yenilenmeden gerçekleşmesini sağlayacağız.

Uygulamamız bir JavaScript-XML uygulaması olacak.

Öncelikle içeriğini okumayı düşündüğümüz XML dosyasını oluşturmalıyız.

Aşağıda çok basit bir şekilde oluşturulmuş XML dosyasını bulacaksınız.

aynısını oluşturunuz.

<?xml version=”1.0″ encoding=”iso-8859-9″?>

<document>

<content>Serdar TÜRKEL</content>

</document>

yukarıdaki XML dosyasını “document.xml” olarak kayıt edin.

Aşağıda XML dosyasındaki değişikliği otomatik olarak algılayan bir uygulama görüyorsunuz.

XML dosyasında <content>…..</content> etiketlerinin arasındaki veriyi değiştirip kayıt ettiğiniz zaman.

otomatik olarak aşağıdaki sayfanızın içeriğindeki yazı da değişecektir.

Aşağıdaki JavaScript kodunu boş bir HTML sayfasının içerisine yerleştirin.

<script language=”javascript1.2″ type=”text/javascript”>

var sint;

window.onload=function(){

sint=setInterval(”readXML()”,1000);

};

function readXML(){

try{

var doc=new ActiveXObject(”Microsoft.XMLDOM”);

doc.async=false;

doc.load(”document.xml”);

if(doc.parseError!=0){

document.body.innerText=doc.parseError.reason;

clearInterval(sint);

}

else{

var elementList=doc.getElementsByTagName(”content”);

var element=elementList.item(0);

document.body.innerText=element.childNodes.item(0).nodeValue;

}

}

catch(e){

document.body.innerTEXT=”Error: “+e;

clearInterval(sint);

}

}

</script>

JAVA APPLET GÜVENLİĞİ

JAVA APPLET GÜVENLİĞİ ( JAVA APPLET SECURITY )
1. APPLET NEDİR
Applet Web Sayfaları üzerinde yayınlabilen class dosyalarıdır. Bir applet mutlaka Apllet sınıfının alt sınıfı olmalıdır. Applet sınıfını yaratabimek için “java.applet” paketi ve “java.awt” paketi ithal edilmelidir. Appletler üzerinde tüm awt bileşenleri yerleşebilir ve her türlü çizim ve boyama işlemi yapılabilir. Çizim ve boyama işlemelerini gerçekleştirmek için “java.awt.Graphics” sınıfından yararlanılır. Bir java classı applet olarak çalıştırılmak isteniyorsa mutlaka “java.applet.Applet” sınıfının alt sınıfı olma zorunluluğu vardır ve “java .applet.Applet” sınıfı “java.awt.Panel” sınıfının alt sınıfı olduğu için, bir Applet aynı zamanda panel gibi de davranabilir. Bu nedenle applet dosyaları bir masaüstü uygulaması gibi çalışırken bir yandan da bir web uygulaması olarak da çalışabilir.

2. APPLET VE AWT
Bir appletin yaşam döngüsü için gerekli olan methodlardan biri “paint” ve “update” methodudur, bu methodlar çizim işlemleri için “Graphics” sınıfından bir parametre alırlar bu nedenle iki sınıf birlikte kullanılmalıdır

3. SWING VE JAPPLET
Applet sınıfı temel olarak awt araç takımı için geliştirilmiş bir sınıftır. Bu nedenle gelişmiş bileşen modeline sahip olan Swing bileşenlerini kapsayamaz. Bu nedenle swing bileşenlerini kapsayacak applet sınıfından daha geniş özllikleri bulunan Japlet sınıfı geliştirilmiştir. Bu konu içerik kapsamı dışında bulunduğu için değinilmemektedir.

4. APPLET SINIFI VE YAŞAM DÖNGÜSÜ
Appletler yaşamlarında belirli evreler geçirirler. Bunlar ;

a) İNİT: İnit metodu applet sınıfı yüklenmeden önce çalışan özel bir methodtur. Applet sınıfından kalıtılarak gelmiştir ve üzerine yazılarak ( Override ) işlem yapılır.

b) START: Bu method init methodundan hemen sonra çalışır ve applet dosyası yürütülmeye başladığında çalışmaya başlar.

c) STOP: Eğer çalışan bir applet dosyasının bulunuduğu sayfadan başka bir URL’ye geçiş yaparsanız veya sayfanızı tamamen kapatırsanız. Applet sınıfında ilk olarak “stop” methodu çalışır. Stop methodu da “Applet” sınıfından kalıtılarak gelmiştir ve üzerine yazılarak kullanılır.

d) DESTROY: Applet bulunan sayfalarınızdan birini kapattığınızda veya başka bir URL’ye geçtiğinizde, ilk olarak stop methodu ardından son olarak çöp toplayıcı method çalışır. Bu methodu tetikleyen method “destroy” methodudur. Destroy methodu Applet sınıfından kalıtılarak gelir ve genellikle üzerine yazılmaz.Bir applet sınıfının hayat döngüsü aşağıdaki gibi olur, stop edilmiş bir applet dosyası init edilmeden tekrar start edilebilir.
CREATOR -> INIT -> START <–> STOP-> DESTROY

5. ÇİZİM METOTLARI PAINT-UPDATE-REPAINT
Paint : bu method parametre olarak Graphics sınfından bir nesne alır, JVM tarafından gönderilen cizim nesnesi kullanılarak Appletler üzerine çizim işlemleri yapılabilir.Update : Bu method da aynı paint methodu gibi çalışır, yalnız paint methodundan farkı bu method çağrıldığı zaman çalışır ve yaptığı çizimleri önceki çizimlerin üzerine geçirir. Oysa paint methodu çağrılmasa da varsayılan olarak genellikle start methodundan sonra çalışır, ayrıca paint methodu çizim yaparken öncek çizimleri siler.Repaint : Paint methodunu bir daha çağrılmasını sağlar. Kısacası sayfanın yenilenmesi sürecini işletir diyebiliriz.

6. BASİT BİR APPLET SINIFI
import java.awt.*;
import java.applet.*;
public class app1 extends Applet{
private String str=null;
public void init(){
str=“serdar”; // ilk olarak bu metot çalışır
}
public void start(){
str= “türkel”; // ikinci olarak bu metot çalışır
}
public void stop(){
this.destroy(); // başka bir URL’ye geçildiği zaman veya pencere kapatıldığı // zaman bu metot çalışır
}
public void paint(Graphics g){
g.drawString(str,10,10); // çizim araçlarının kullanıldığı method.
}
}

Şekil 1.1
Yukarıdaki kod derlendikten sonra artık oluşan class dosyamızı HTML dosyası içerisine gömebiliriz.

<html>
<head>
<tıtle>example for applet</tıtle>
</head>
<body>
<applet code=“app1.class” width=“300” height=“300”>
</applet>
</body>
</html>
Şekil 1.2
Yukarıdaki kod ile basit bir applet sınıfını sayfanıza ekleyebilirsiniz.
APPLET ETİKETİ
a) CODE : yüklenecek applet classının adı belirtilir
b) CODEBASE: yüklenecek applet dosyası html dosyasından farklı bir adreste ise belirtilecek açık yol bu bölüme yazılmalıdır.
c) WIDTH: applet sınıfının html sayfasının üzerinde ne kadar genişlik kaplayacağını belirler.
d) HEIGHT: Applet sınıfının html sayfasının üzerinde ne kadar yükseklik kaplayacağını belirler.
e) ARCHIVE: Bu özellik sayesinde jar dosyası haline getirilmiş applet dosyalarını daha verimli bir şekilde yükleyebiliriz. Jar dosyalarını belirtmek için kullanılır.

7. HTML ÜZERİNDEN APPLET’E VERİ GÖNDERİLMESİ
<html>
<head><tıtle>example for applet</tıtle>
</head>
<body>
<applet code=“app1.class” width=“300” height=“300”>
<param name=“ad” value=“serdar türkel”>
</applet>
</body>
</html>
Şekil 1.3
Gönderilecek veriler param etiketi ile applet etiketinin içine yerleştirilir bu sayede applet init veya start olma sırasında bu param etiketindeki value değerini alabilir. Aşağıdaki kod init sırasında param etiketindeki verinin nasıl alındığını göstermektedir. Aşağıdaki kodu şekil 1.1’deki kod bloğundaki init methodunun içerisine yazınız.

….
str= “serdar”;
str=this.getParameter(“ad”);


this.getParameter(“ad”) kodu sayesinde ad isimli param etiketinin verisini alabilirsiniz.

8. JAVASCRIPT İLE APPLET CLASSLARINA MÜDAHALE
Şekil 1.1’de yazmış olduğumuz java kodunun içerisine aşağıdaki methodu ekleyin.

public void strYaz(String str){
this.str=str;repaint();
}
Şekil 2.1

Yukarıdaki kodu ekledikten sonra derlemeyi unutmayın!
Şekil 1.3’de yazmış olduğunuz HTML kodunun “head” ve “body” etiketleri arasına aşağıdaki JavaScript kodunu yerleştiriniz.

<script language=“javascript1.2”>
function strGonder(){
var obj=document.getElementById;
obj(“app”).strYaz(obj(“str”).value);
}
</script>
Şekil 2.2

Şekil 2.2’deki kod üzerine dikkat edilirse, applet classına ait methodlar javascript üzerinde yaratılan bir nesne aracılığı ile rahatlıkla çağrılabilir. Sadece applet nesnemize ait bir id ismine ihtiyacımız vardır, şekil 2.4’de bu id numarası verilmektedir. JavaScript kodunu yerleştirdikten sonra aşağıdaki kodları da aynı HTML dosyanızın “</body>” etiketinin hemen üstüne yerleştirin.

<input name= “str” type= “text” id= “str”>
<input name= “gonder” type=”button” id= “gonder” value= “gönder” onClick= “strGonder()”>
Şekil 2.3

Son olarak <applet> etiketinizi aşağıdaki gibi düzenleyin, appletimize id ismi veriyoruz

<applet code=“app1.class” width=“300” height=“300” id=“app”>
Şekil 2.4

9. VARSAYILAN APPLET SINIRLILIKLARI
Appletler sonuç olarak bir programlama dilinin ürünüdür, bu nedenle bir programlama dilinin tüm nimetlerinden yararlanması mümkündür. Ancak internet ortamında bu mümkün değildir. Eğer internet ortamında da appletler bir java programı kadar özgür olabilseydi, kullanıcı güvenliğinden bahsetmemiz mümkün olmazdı. Bu nedenle bütün appletler çalışma sırasında varsayılan olarak bazı kısıtlamalara maruz kalmaktadır.( Bu kısıtlamaların nasıl aşılacağı dijital imzalar bölümünde anlatılacaktır ).Bu kısıtlamalar : Bir applet;a) yayınlandığı sunucu dışında hiçbir sunucu ile iletişime geçemezb)Kullanıcının sisteminden herhangi bir dosya silemez, değiştiremez veya sisteme bir dosya ekleyemez veya bir dosya alamazc)Kullanıcının sisteminde bulunan hiçbir programı çalıştıramaz, çalıştırmak için başvuramaz.Yukarıda belirtilen kısıtlamalar imzalı olmayan veya imzası kabul edilmeyen applet uygulamaları için geçerlidir.

10. APPLET SINIRLILIKLARINI AŞMAK
Bir önceki bahsedilen kısıtlamaları aşmak için yapmış olduğumuz applet dosyasını arşiv haline getirdikten sonra bir sertifika ile imzalamalıyız. Sertifika ile imzalanmış olan bir applet çalışma sırasında sertifika bilgisi verir. Eğer sertifika bilgisi doğrulanıyorsa veya kök sertifikalar içerisinde yer alıyorsa kullanıcı bir mesaj almaz ve tüm kısıtlamalar kaldırılarak applet dosyası tüm erişimlere açık olarak kullanıcının sisteminde çalışır. Ancak imzalanmış sertifika kullanıcının siteminde bulunmuyorsa veya kök sertifikalar içerisinde yoksa, kullanıcı bir bilgilendirme mesajı alır, bu mesaj kullanıcı tarafından kabul edilirse applet yine tüm erişimlere kavuşur. Eğer kullanıcı sertifika belgesini kabul etmezse applet başlangıçtaki kısıtlamaları ile çalışmaya devam eder. Applet sınırlılıkarını aşmak için sertifika edinmeniz gerekir. Sertifika edinmek için java araçlarından yararlanabilirsiniz.

11. DİJİTAL İMZA NEDİR?
Yazılı dokümanlarda kullandığınız imzalar gibi, dijital imzalar da günümüzde e-posta veya elektronik verilerin yazarlarını/sahiplerini tanılamada kullanılmaktadır. Dijital imzalar, Dijital Sertifikalar kullanılarak yaratılır ve doğrulanırlar. Bir bilgiyi imzalamak, güvenli bir alışverişi gerçekleştirmek için kendi özel Dijital Sertifikanıza ihtiyaç vardır. Günümüzde uluslararası yasama organları dijital imzaları ıslak imzalar gibi yasal olarak bağlayıcı ve uluslararası çapta kabul edilebilir kılmak için yasalar çıkarmışlardır. Dijital imzaların sağladığı başlıca önemli fonksiyonlar şöyledir: tanılama, gizlilik, veri bütünlüğü ve inkar-edilememe.Gerçek hayatta kişiyi tanımlayan özellikler sanal ortam da dijital imza olarak adlandırılır. Parmak izi gibi. Dijital imza kullanılarak yapılan iletişimde az önce de bahsedildiği inkar edebilme durumu ortadan kalkar. İletişimin gerçekten de doğru kişi tarafından yapılıp yapılmadığını test eder ve doğrular. Dijital imzalar bu doğrulama sürecini gerçekleştirmek için iki temel özellikden yararlanır;1. özel anahtar2. genel anahtar

12. ANAHTAR NEDİR
Anahtar, şifrelenen metin için algoritmanın bir parçası olan basit rakamsal bir değerdir. Bir dosyayı şifrelemede ve deşifre etmede kullanılan karakterlerin bir sekansıdır. Simetrik anahtar algoritması için, şifreleme ve deşifreleme için aynı anahtar kullanılır. Anonim anahtar algoritmaları için ise şifreleme ve deşifre işlemleri birbirini tamamlayarak kullanılan “anonim ve özel” bir anahtar çifti ile yapılır.

a) ÖZEL ANAHTAR: Bu anahtar kişiye özel anahtardır ve sadece imza sahibinde bulunur ve iyi bir şekilde saklanmalıdır. Bu anahtar sayesinde size gelen mesajları doğrular ve okuyabilirsiniz. Özel anahtarlar kendilerine gelen ve genel anahtar ile imzalanıp şifrelenmiş veriyi çözen algoritmaya sahitir. Özel anahtar sadece kendisin ait olan genel anahtar tarafından imzalanmış verileri çözer, ayrıca genel anahtar tarafından imzalanmış olan bir veri sadece kendisine ait olan özel anahtar tarafından çözülebilir. Bu sayede size gelmesi gereken veriler başkasının eline geçse dahi, ellerinde sizin özel anahtarınız bulunmadığı takdirde hiçbir verinizi okuyamayacaklardır. Özel anahtarın güvenliği bu nedenle çok önemlidir.

b) GENEL ANAHTAR: Genel anahtar kişinin iletişim kurmak istediği kişilerde bulunan anahtardır ve sadece iletişim kurulacak kişilerde bulunabilir. Bu anahtarın gizlliği özel anahtar kadar olmasa da önem arz eder. Özellikle tek taraflı imzalanmış bir iletişim kullanıyorsanız genel anahtarın gizliliği de önemlidir. Genel anahtar özel anahtar ile şifrelenmiş veriyi çözecek algoritmaya sahiptir. Özel anahtar kendi şifrelediği veriyi kendisi çözemez, genel anahtar da aynı şekilde kendi şifrelediği veriyi kendisi çözemez, buna anahtar-kilit ilişkisi denilmektedir. Özel anahtar ile imzalanmış bir mesaj sadece o anahtarın kilidi tarafından yani genel anahtar tarafından çözülebilir. Bu da sizin isteğiniz dışında birisine gidecek olan mesajın o kişi tarafından okunamayacağıdır. Tabi sizin genel anahtarınıza sahip değilse. Çoğu durumda kişiler kendilerine ait genel anahtarları internette yayınlarlar ve herkes tarafından erişilmesini sağlarlar. Çünkü genel anahtarlarını sadece mesaj almak için kullanılırlar, mesaj göndermek için ise, gönderecekleri kişinin genel anahtarını kullanılırlar.Özel anahtar ve genel anahtar birlikte oluşturulurlar. Oluşturulan anahtar çifti ilgili bir veri için oluşturulur. Ve veri imzalandığı zaman sadece o veriye özel bir parmak izi oluşur. Bu parmak izi verinin doğrulanması sürecinde kullanılacaktır. Eğer veri imzalandıktan sonra veri üzerinde bir bit dahi değiştirilirse doğrulama süreci bozulacağından veri çalıştırılmayacaktır.Bahsedilen bu anahtar çiftleri bir sertifikayı temsil ederler.

c) DİJİTAL İMZA NASIL ÇALIŞIR: Dijital İmza’yı yaratan dijital sertifikalardır. Pekiyi, dijital sertifikalar nasıl çalışır? Dijital Sertifikalar kişi yada kurumları anonim anahtara bağlarlar. Bu işlemin ise Sertifika Mercii denilen bir kurum tarafından yapılması gerekmektedir. Ayrıca hizmet veren Tarafsız ve Güvenilir Sertifika Mercii’leri de bulunmaktadır.Dijital Sertifikalar, anonim ve özel anahtar çiftinin oluşturduğu Anonim Anahtar Kriptografisi’ne dayanır. Özel anahtar sadece sahibi tarafından bilinir ve dijital imzanın yaratılmasında kullanılır. Bu anahtarın -aynı kredi kartı örneğinde olduğu gibi- sahibi tarafından mutlaka gizli tutulması gerekmektedir. Anonim Anahtar ise herkes tarafından bilinir ve dijital imzanın geçerliliğini kontrol etmek için kullanılır. Bu anahtarlar numaralardan oluşmakta olup bütün bu işlemler bilgisayarınız tarafından otomatik olarak yapılırlar.
1. ilk olarak bir CA üzerinden sertifika talebinde bulunulur
2. sertifika talebi için gerekli şartlar sağlandıktan sonra sertifika alınır
3. sertifika üzerinde bulunan özel anahtar yayın yapılacak pc üzerinde bulunur
4. genel anahtar ise CA tarafından doğurlama süreci için tutulur. CA talepte bulunanı doğrular.
5. yayın noktasından doğrulama sürecini tamamlayan bilgi alındıktan sonra yayımlayıcı bulunduğu noktada bir sertifika oluşturur ve istekleri bu sertifika kullanarak sağlar.
6. yayın klasörüne bir istekde bulunulursa isteğe sertifikalı bir onay gönderilerek cevap verilir.
7. istemciye gelen veriler doğrulama sürecinden geçemezse imstemci tarafında işlmeler gerçekleştirilmez.

13. ANAHTAR DEPOSU
Java ile dijital imza geliştirmeden öce applet dosyamızı jar aracı ile arşiv dosyasına çevirmeliyiz. ( Jar dosyasına çevirmek konu içeriğinde yer almadığı için detaylarına girilmeyecektir).Jar dosyasını oluşturmadan önce manifest.mf dosyamızı oluşturuyoruz.

Manifest-Version: 1.0
Created-By: 1.5.0_04 (Sun Microsystems Inc.)
Main-Class: app1
Şekil 3.1

Aşağıdaki kodu manifest.mf dosyasının ve app1.class dosyasının bulunduğu yerde çalıştırın

Jar –cvfm app1.jar manifest.mf *.class

Şekil 3.2

Javada genel ve özel anahtarların saklandığı bir anahtar deposu yaratılabilir bunun için “keytool” aracından yararlanıyoruz. Bir anahtar deposu içerisine bir anahtar yerleştirmek için iki güvenlik şifresine ihtiyacınız olacaktır. Birincisi anahtar deposuna giriş şifresi, ikincisi kullanacağınız anahtar çiftine ait şifredir. İki şifreyi de anahtar çifti oluşturma sürecinde veriyoruz. Yeni bir anahtar deposu oluşturmak için keytool aracına “-genkey” parametresini ekleriz, anahtar deposunun kaydedileceği yeri ve adını belirtmek için ise, “-keystore ” parametresini ekleriz. Anahtar deposuna şifre koymak için “-storepass” parametresinden yararlanırız. Anahtar çiftleri için şifre vermek için “-keypass” parametresini ekleriz. Anahtar çiftleri anahtar deposunda bir isim adı altıda tutulurlar ( bu isimlerin sertifikayı temsil ettiğinden bahsetmiştim ) bu isimi tanımlamak için “-alias ” parametresini ekleriz. Aşağıdaki örnek bir sertifika deposu oluşturur.

Keytool –genkey –keystore C:\depo.jdb –storepass 123456 –keypass 654321 –alias sertifika1

Şekil 3.3
Bu işlemlerden sonra aşağıdaki gibi gelen pencereyi düzenli bir şekilde doldurun.

What is your first and last name? [Unknown]: Serdar TÜRKEL
What is the name of your organizational unit? [Unknown]: Teach
What is the name of your organization? [Unknown]: edutime – academy of information technologies
What is the name of your City or Locality? [Unknown]: marmara
What is the name of your State or Province? [Unknown]: istanbul
What is the two-letter country code for this unit? [Unknown]: TR
Is CN=Serdar TÜRKEL, OU=Teach, O= edutime – academy of information technologies, L=marmara, ST=istanbul, C=TR correct? [no]: yes

Şekil 3.4
Örnekteki gibi bilgileri doldurduktan sonra yes yazıp enter tuşuna basın. Artık sizinde bir anahtar deponuz ve anahtar çiftiniz var. Şimdi bununlar verilerinizi imzalayabilirsiniz. Yarattığımız bu sertifika ile ilk olarak anahtar depomuzdan çıkartıp app1.jar dosyamızı imzalayacağız. Sertifika ile imzlama yapmak için jarsigner aracından yararlanağız. bu araç ile keytool aracında olduğu gibi anahtar deposunun yerini, anahtar deposunun şifresini, anahtar çiftinin adını ve şifresini girdikten sonra ekstra olarak aşağıdaki özellikeride girmelisiniz.

-signedjar

Şekil 3.5

Örnek bir imzalama :
-jarsigner –keystore C:\depo.jdb –storepass 123456 –keypass 654321 –signedjar sapp1.jar app1.jar sertifika1

Şekil3.6

Artık imzalanmış yeni bir jar dosyasına sahibiz. Bu dosyamızın adı sapp1.jar. bu dosyayı html sayfasında yayınladığımız zaman karşımaza yapmış olduğumuz sertifika bilgisi gelecektir. Eğer gelen isteğe evet derseniz tüm applet sınırlılıklarından kurtulmuş olacaksınız. Red ederseniz yine aynı kısıtlamalarla çalışmaya devam edecektir. Sertifikalı applet oluşturma basamak şimdilik bu kadar dah sonraki dökümanlarımda sertifikasyon işlemlerine daha detaylı olarak değinmeyi düşünüyorum.İyi çalışmalar