ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

زکات علم یاد دادن آن به دیگران است، کمک کنیم که علم گسترش یابد.

طبقه بندی موضوعی

۳ مطلب در مهر ۱۳۹۱ ثبت شده است

به نام خدا

 

بالاخره پس از یک هفته دور بودن از زندگی برنامه نویسی و تجربه کردن چهره های دیگر زندگی امروز به زندگی برنامه نویسی برگشتم، به قول یه فیلسوفی میگفت که در هر چیزی نکته ای یادگرفتنی وجود دارد و چه نکاتی که باید آموخت ...

امروز میخواهم راجع به یکی از نقاط قوت جاوا و همچنین یکی از علایق خودم به نام RMI بنویسیم.

 

RMI (Remote Method Invocation)

میتوان آنرا به فراخانی متد راه دور ترجمه کرد، یک رابط برنامه نویسی (API) در جاوا است که وظیفه آن فراخوانی یک متد در یک شی (Object) که در ماشین دیگری قرار دارد است، این یک تعریف کلی بود و اگر بخواهیم جزئی تر به مطلب بپردازیم میتوانیم یک مدل کلاینت/سرور را در نظر بگیریم که در أن سرور ماشینی است که متد قابل فرخوانی در آن وجود دارد و کلاینت ماشینی است که متدی را از سرور فراخوانی میکند.

 

سرور - ماشینی است که وظیفه انجام دادن یک عمل (Task) را بر اساس یک درخواست دارد.

کلاینت - ماشینی است که درخواستی را به ماشین سرور میفرستد.

 

اگر شما میخواهید که یک متد را از یک کلاس فراخوانی کنید اولا باید بتوانید در ماشین سرور از آن کلاس یک شی بسازید ثانیا آن کلاس باید قابل دسترس باشد.

در RMI، کلاسی که قرار است متدی از آن فرخوانی بشود فقط و فقط در ماشین سرور وجود دارد و کلاینت قرار است که درخواستی به سرور بفرستد تا سرور آن کار را انجام دهد. برای این کار نیاز به RMI registry داریم.

RMI registry چیست : RMI registry را مانند یک کتاب در نظر بگیرید که در آن اشیا مورد نیاز کلاینتها از طرف سرورها با یک نام مشخص (که میتواند RMI url باشد) در آن ثبت شده است و کلاینتها میتوانند با استفاده از نام اشیا که در هنگام ثبت در RMI registry به آن اختصاص داده شده است، آن شی را از RMI registry فراخوانی میکنند.

 

اگر بخواهیم یک متدی داشته باشیم که بتوان این متد  را فراخوانی کنیم باید این متد را در یک interface که از remote interface ارث برده است معرفی کنیم.

برای مثال  :

import java.rmi.*;
public interface NameCollections extends Remote //Remote Interface{
    public String getName(int index)throws RemoteException;//Remotely Accessible Method
}

و کلاسی که این ایترفیس را پیاده سازی میکند مانند زیر است :

import java.rmi.*;
import java.util.*;
import java.rmi.server.*;


class NameStorage extends UnicastRemoteObject implements NameCollections { //A Class  That Implements The Remote Interface

private Map name;
public NameStorage()throws RemoteException{
   name=new HashMap();
   name.put(1,"iman");
   name.put(2,"reihanian");
}

public String getName(int index)throws RemoteException{
   String str=name.get(new Integer(index));
   return str;
}

در ادامه پیاده سازی RMI در سرور :

import java.rmi.*;
import javax.naming.*;
class NameServer {
public static void main(String args[]) throws RemoteException,NamingException {
   Context ictxt=new InitialContext();
   NameStorage store=new NameStorage();
   ictxt.bind("rmi:Storage",store);//Binding The Remote Object(store) With A Name(storage)
   System.out.println("Clients can invoke the methods....");
   }
}

و در قسمت کلاینت :

import java.rmi.*;
import java.util.*;
import javax.naming.*;

class NameClient {
public static void main(String args[])throws NamingException,RemoteException {
    Context itxt=new InitialContext(); //Searching For The Remote Object In The RMI registry  
    NameCollections coll= (NameCollections) itxt.lookup("rmi://localhost/Storage");
    String n1=coll.getName(2);// Invoking The Remote Method
    System.out.println("Name Obtained from the server:" + n1);
    }
} 

اینطور به نظر میرسد که متد از سرور فراخوانی شده است در حالیکه فقط اینطور به نظر میرسد و واقعا اینطور نیست، کلاینت متدی را که در شی stub است فرخوانی کرده است و این شی stub متد سرور را فراخوانی کرده است و نتیجه را از سرور به کلاینت بر میگرداند.

stub چیست ؟ stub را میتوان به عنوان یک cache از اشیا remote در نظر گرفت که در کلاینت وجود دارند.

 

میتوان شکل کلی RMI را بصورت زیر رسم کرد :

۰ موافقین ۰ مخالفین ۰ ۲۴ مهر ۹۱ ، ۱۰:۲۵
ایمان ریحانیان

سلام

 

این روزها بازار جستجوگرها خیلی داغ شده و هر کدام از موتورهای جستجو امکانات و سرویس های مختلفی را در موضوعات مختلف در اختیار کاربران قرار میدهند و خود را دقیق تر و بهتر از دیگران معرفی میکنند. که این دقت و بهتری میتواند از نظر جستجو و یا سرویس های مختلف باشد، میتوان جستجو گر ها را به عنوان دروازه های ورود افراد به دنیای اطلاعات دانست و این دروازه ها نقش مهمی در یافتن اطلاعات درست را دارند و میتوان گفت که با این سزعت روزافزون حجم داده ها و اطلاعات، بدون جستجوگرها کاربران تقریبا نمیتوانند اطلاعات زیادی در مورد موضوع خاصی بدست آورند.

بعضی از آنها به عنوان یک ابرجستجوگر (Meta Search Engine) از موتورهای جستجوی دیگر استفاده میکنند ولی سرویس های مختلفی را برای دقیق تر شدن و کارایی بهتر در اختیار کاربر قرار میدهند.

به نظرم رسید که چندین جستجوگر را که خودم با آنها کار کردم و از نظر کارایی و دقت و سرویس مطرح بوده اند را در این پست معرفی کنم.

موتور جستجو های عمومی:

 

Yahoo

Bing

Google

Blekko

...

 

و ابرجستجوگرهای مثل :

Duckduckgo

Dogpile

DeeperWeb

Mamma

WebCrawler

...

و میتوان لیست کامل تری از موتورهای جستجو و ابرجستجوگرها را در ویکی پیدا کرد. انتخاب شخصی من برای یک جستجوگر استفاده از یک ابر جستجوگر میباشد چون هم در حوزه ی بزرگتری جستجو میکند و هم سرویس های بیشتری را در اختیار کاربر قرار میدهد.

 

۱ موافقین ۰ مخالفین ۰ ۰۶ مهر ۹۱ ، ۱۰:۳۲
ایمان ریحانیان

سلام

 

مطلب امروز در مورد خواندن صفحه وب با استفاده از کلاس های جاوا و بدون استفاده از API خاصی است که امیدوارم مفید واقع شود.

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class Main {
public static void main(String[] args) {
try {
URL url = new URL("http://blog.reihanian.com/");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
String strTemp = "";
while(null != (strTemp = br.readLine())){
System.out.println(strTemp);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}



با استفاده از این نمونه کد میتوان درخواستی از نوع پروتکل HTTP فرستاد و جواب آنرا دریافت کرد یا به عبارت دیگر یک صفحه وب را خواند.
در خط اول برنامه از کلاس URL استفاده شده است. این کلاس مانند یک اشاره گر به یک منبع در وب میباشد حالا این منبع میتواند یک فایل یا یک دایرکتوری باشد.
در خط بعدی با استفاده از متد ()openStream کانکشنی با آن منبع مشخص شده در کلاس URL برقرار میکند و آنرا میخواند و یک کلاس InputStream برمیگرداند.
از این مرحله به بعد همانند خواندن داده از یک فایل رفتار میکنیم.
و در مرحله بعد از کلاس InputStreamReader مانند پلی داده های باتی را به داده هایی از نوع کاراکتر تبدیل میکند.
و در مرحله بعدی کلاس BufferedReader داده های کاراکتری را برای دسترسی بهتر و سریعتر buffer میکند.
و در نهایت با استفاده از حلقه while داده ها را از buffer بصورت خطی میخواند و آنها را در متغییر strTemp ذخیره میکند و در console برنامه چاپ میکند.
کل مجموعه کد در بلوک try - catch قرار دارد که اگر خطایی رخ داد، خطا شناسایی شود.

۰ موافقین ۰ مخالفین ۰ ۰۶ مهر ۹۱ ، ۰۹:۴۹
ایمان ریحانیان