Wednesday, December 29, 2010

ජාවා වැඩසටහනක් සහ PHP වැඩසටහනක් අතර දත්ත හුවමාරු කරන අන්දම

එක දිගටම ජාවා සම්බන්ද මූලධර්ම සාකච්ඡා කරපු නිසා අපි මේ පාඩමෙන් ප්‍රායෝගික පැත්තට බර කරුණු ටිකක් අධ්‍යයනය කරමු. මේ වන විට පරිගණක වැඩසටහනක් යනු හුදෙක්ම එක් පරිගණකයකට සීමාවූ දෙයක් නොවන බව අපි කවුරුත් දන්න දෙයක්නේ. බොහොමයක් පරිගණක වැඩසටහන් අන්තර්ජාලයට සම්බන්දව පවතිනවා. උදාහරණ විදියට internet messenger වැඩසටහන් , virus guards, වැනි වැඩසටහන් දක්වන්න පුලුවන්. වයිරස් ගාඩ් එකක් සැලකුවොත් එය අන්තර්ජාලය හා සම්බන්ද වන අවස්ථා තමයි අලුත් virus definition තිබේ දැයි පරීක්‍ෂා කිරීම, අලුත් virus definition තිබේනම් ඒවා ලබා ගැනීම, සැක සහිත ගොණුවක් අදාල ආයතනයට upload කිරීම වැනි අවස්ථා. මෙහිදී මූලිකවම සිදුවන්නේ දුරස්ථ සර්වරයක ඇති වැඩසටහනක් හා කිසියම් සන්නිවේදනයක් කිරීමයි. 

අපි මෙම පාඩමෙන් අධ්‍යයනය කිරීමට යන්නේ ජාවා වැඩසටහනකින් දුරස්ථ වැඩසටහනක් සමග සම්බන්ද වන ආකාරයයි. මාතෘකාවට අනුව අපි දුරස්ථ වැඩසටහන ලෙස යොදාගන්නේ PHP script එකක්. නමුත් මෙම දුරස්ථ වැඩසටහන Python හෝ Perl script එකක් හෝ වෙනත් ඕනෑම server side script එකක් වීමට පුලුවන්. 

කොහොමද දුරස්ථ වැඩසටහනට දත්ත යවන්නේ?
මේ සඳහා අපි යොදාගන්නේ POST method එකයි.  HTTP (Hypertext Transfer Protocol) එකට අනුව දත්ත හුවමාරු කිරීමේදී GET සහ POST යනුවෙන් ක්‍රම දෙකක් පවතිනවා. ඉන් GET ක්‍රමයට අනුව දත්ත හුවමාරු කිරීමේදී අදාල දත්ත URL එකට අමුණා යැවීම සිදුවනවා එනම් මෙම දත්ත පිටතට දෘෂ්‍යමාන වනවා එම නිසා password සම්බන්ද දත්ත මෙම ක්‍රමයට හුවමාරු කරන්නේ නැහැ. අනික වරකට යැවිය හැකි දත්ත ප්‍රමාණයේ සීමාවක්ද පවතිනවා. 
GET Request එකකට උදාහරණයක්
http://mydomain.org/process.php?name=Kanishka&passw=hellox
 POST method එකේදී HTTP request එකේ header එක තුල අදාල දත්ත ඇතුලත්කොට යැවීම සිදුකරනවා. මෙම වැඩසටහනේදී අපි යොදාගන්නේ POST method එකයි. මෙම methods ගැන වැඩිදුර තොරතුරු දැනගැනීම සඳහා මෙතනින් පිවිසෙන්න.

 අපිට මේ සඳහා මීට පෙර ඉගෙනගත් streams සම්බන්ද දැනුම වැදගත් වනවා.  මෙම වැඩ සටහනෙන් සිදුකරනුයේ දෙන ලද නගරයකට අදාල area code එක ලබාදීමයි.  මෙම PHP  script එක පහත දැක්වෙනවා.
telCodes.php
<?php
/**      
*Script  : telCodes.php
*Author  : Kanishka Dilshan      
*Purpose : Processing a remote request
*Blog    : http://javaxclass.blogspot.com      
*/ 

$code=$_POST['code'];
$file=fopen("codes.txt","r") or exit("Data file is missing!");
$status=FALSE;
while(!feof($file)){
 $str=fgets($file);
 if(strpos($str,$code)!==FALSE){
  echo $str;
  $status=TRUE;
  break;
 }
}
if($status===FALSE){
 echo "code is not found!";
}
fclose($file);
?>
මෙම වැඩසටහනේ 09 වන පේලියේදී POST request එක මගින් එවන ලද අදාල දත්තය ලබාගන්නවා එය code නම් parameter එක සමග සම්බන්දව පවතිනවා. ඉන්පසු data file එක විවෘත්ත කර එවන ලද code එක එතුල තිබේදැයි පේලියෙන් පේලිය කියවා පිරික්සා බලනවා. එය හමුවූ විට echo විධානය භාවිතාකර අදාල response එක ලබාදෙනවා.

දැන් අපි බලමු මෙම PHP Script එකට දත්ත යවා එහි response එක ලබාගැනීමට ලිවිය හැකි ජාවා වැඩසටහන. මෙම ක්‍රියාවලිය සිදුකරගැනීමට අපි මෙහිදී යොදාගන්නේ net පැකේජය තුල ඇතුලත් URL සහ URLConnection නම් classes දෙකයි. URLConnection එක streams කිහිපයකට සම්බන්ද කරගෙන අදාල ක්‍රියාවලිය සිදුකරගැනීම මෙහිදී මූලික වශයෙන් සිදුවනවා. මෙම ක්‍රියාවලිය Sockets යොදාගෙනද සිදු කිරීම කල හැකියි. අපි ඉදිරි පාඩම් පෙළකින් Sockets පිලිබඳ සාකච්ඡා කරමු.
Java_POST_Req.java
/**      
*class  : Java_POST_Req
*Author : Kanishka Dilshan      
*Purpose: Making a post request to a php script and retrieve the response
*Blog   : http://javaxclass.blogspot.com      
*/ 

import java.net.*;
import java.util.Scanner;
import java.io.*;

class Java_POST_Req{
 public static void main(String args[]){
  Scanner sc=new Scanner(System.in);
  System.out.print("Enter the area code or area : ");
  String value=sc.nextLine();
  
  OutputStreamWriter outWrtr=null;
  BufferedReader buffRdr=null;
  try{
   String httpdata=URLEncoder.encode("code","UTF-8")+"="+URLEncoder.encode(value,"UTF-8");
   URL remoteResource=new URL("http://kanishka.hostei.com/telcodes/telCodes.php");
   URLConnection conn=remoteResource.openConnection();
   conn.setConnectTimeout(30*1000);
   conn.setDoOutput(true);
   outWrtr=new OutputStreamWriter(conn.getOutputStream());
   outWrtr.write(httpdata);
   outWrtr.flush();
   
   //read the response
   buffRdr=new BufferedReader(new InputStreamReader(conn.getInputStream()));
   String line;
   while((line=buffRdr.readLine())!= null){
    System.out.println(line);
   }
  }catch(Exception e){
   System.err.println("Error : "+e.getMessage());
  } finally{
   try{
    outWrtr.close();
    buffRdr.close();
   }catch(Exception e){}
  }
 }
}

output :

මේ සඳහා ලියන ලද පහත දැක්වෙන applet එක භාවිතා කර මෙහි සිදුවන ක්‍රියාවලිය පිරික්සා බලන්න.

සියලුම කේත පාඩම අවසානයේ අමුණා ඇත.
අපි දැන් මෙම ජාවා වැඩසටහන පේළිය විස්තර කරගනිමු.

Line14 - Line 16 :
මෙහිදී Scanner object එකක් සාදාගෙන console එකෙන් user input එකක් ලබාගැනීම සිදුවනවා.
Line21:
මෙහිදී PHP වැඩසටහනට යැවීමට අවශ්‍ය data සූදානම් කිරීම සිදුකෙරෙනවා. encode("code","UTF-8") මගින් parameter එකද URLEncoder.encode(value,"UTF-8") මගින් අදාල velue එකද UTF-8 ක්‍රමයට  එනම් unicode ක්‍රමයට encode කිරීම සිදුකෙරෙනවා.
Line22:
PHP script එකට අදාල URL object එකක් සෑදීම මෙහිදී සිදුකෙරෙනවා. 
Line23: 
අදාල PHP script එක සමග සම්බන්දතාවය නිරූපණය වන URLConnection object එකක් මෙහිදී සකසාගැනීම සිදුකෙරෙනවා.
Line24:
connection timeout එක සඳහන් කිරීමෙන් සිදුකර ඇත්තේ අදාල PHP වැඩසටහන සමග connection එකක් ස්ථාපනය කරගැනීමට උපරිම වශයෙන් තත්පර 30ක කාලයක් ලබාදීමයි.

Line25:   
මෙමගින්  URLConnection ඔබ්ජෙක්ට් එක මගින් ඒසමග සම්බන්දවී ඇති PHP වැඩසටහනට දත්ත ලිවීම සිදුකරන බව ඇඟවීම සිදුකරනවා.

Line26-Line27:
මෙහිදී නව OutputStreamWriter object එකක් සකසාගෙන එයට අදාල  URLConnection එකෙහි output stream එක සම්බන්ද කරගෙන සකස් කරගත් HTTP data එම URLConnection එකෙහි output stream එකට ලියනු ලබනවා. එනම් අදාල PHP script එක වෙත යවනු ලබනවා.

Line31-Line34:
PHP වැඩසටහන අප යවන HTTP request එක process කිරීමෙන් අනතුරුව ලබාදෙන response එක කියවීම මෙහිදී සිදුවනවා. මෙහිදී සකසාගෙන ඇති BufferedReader object එක සම්බන්ද වී ඇත්තේ  URLConnection එකෙහි input stream එකටයි. එනම් PHP වැඩසටහන මගින් ලබාදෙන output එකටයි.
Line36-Line42:
මේ පිලිබඳව අපි Streams සම්බන්ද පාඩම් වලදී විස්තරාත්මකව අධ්‍යයනය කර තිබෙන නිසා මෙහිදී එය නැවත විස්තර කිරීම අනවශ්‍යවේ.
ඉහත දක්වා ඇති source code  සහ applet එකට අදාල මූලාශ්‍ර කේත ලබා ගැනීමට පහත දක්වා ඇති link එක භාවිතාකරන්න. 

16 comments:

  1. java+php .....niyamai machan,,aluth aluth eaawa daamu,,,,,elazzz

    ReplyDelete
  2. Your blog is really helpful. Thanks.

    http://thariya.blogspot.com/2011/01/first-lab-of-software-technology-ii.html

    ReplyDelete
  3. ප්‍රයෝජනවත්
    ජයවේවා...........

    ReplyDelete
  4. niyamai ayye.godak hondata liyala tiyenawa.me wede digatama karagena yanna shakthiya dhayyraya lebewa.theruwan saranai

    ReplyDelete
  5. niyamai aiye hodata karan yanna...JAVA thawa igena gena apitath kiyala denna..thank u so...much

    ReplyDelete
  6. Nice lesson aiyaa... We expect the next lesson asap....

    Wish you good luck...

    ReplyDelete
  7. pattai machan wade..digatama karagena palayan...Good Luck..

    ReplyDelete
  8. php script ekakin java application ekak palanaya karanne kohomada.. me widihata....

    ReplyDelete
  9. pleace post how to connect java web application and java dektop application......

    ReplyDelete
  10. @MADU
    php script එකකින් ජාවා වැඩසටහනක් පාලනය කිරීමේදී කල හැකි එක් විකල්පයක් තමයි වරින් වර පාලනය කිරීමට අදාල විධානයන් echo කල හැකි php script එකක් ජාවා වැඩසටහනක් මහින් කියවීමට සැලැස්වීම උදා : තත් 5 කට වරක්

    එවිට එම විධානයට අදාලව ජාවා වැඩසටහනේ අදාල කාර්යයන් සිදුකල හැකිය.

    ReplyDelete
  11. @Anonymous May 17, 2011 5:04 PM
    සම්බන්ද කරවීමට අදාල කොටස සඳහා Socket යොදාගත හැකිය. නැතහොත් මෙම වැඩසටහනේ පරිදි URLConnection එකක් යොදාගත හැකිය.

    ReplyDelete
  12. Socket සහ URLConnection ක්‍රම දෙකෙන් වඩාත්ම සාර්ථක ක්‍රමය මොකක්ද කියල කියන්න පුලුවන්ද? වටිනා ලිපියක්! ස්තූතියි!

    ReplyDelete
  13. @ගිහාන්
    Socket සහ URLConnection දෙකම අවස්ථානුකූලව යොදාගන්න ඕන. එකක් විතරක් සාර්ථකයි කියල කියන්න බෑ.

    උදා :
    * HTTP protocol එකේ වැඩ කරනකොට URLConnection එක Socket වලට වඩා ඉතාම පහසුයි.

    * HTTP නොවන වෙනත් අවස්ථා එනම් යම් network එකක අපි විසින් සාදාගත් ප්‍රෝටොකෝල් එකක් සඳහා සඳහා Socket යොදාගැනීමට පුලුවන් එහි නම්‍යශීලී බව නිසා.

    ReplyDelete
  14. mama aluth, mewa elama java rahas thamai, blog akaknam maru digatama karagena yanna, ela.....

    ReplyDelete