برنامه نویسی شبکه در جاوا

ناصر نادری | 1394/07/04


بنام  خدا .

در این آموزش قصد داریم برنامه نویسی شبکه  رو توی زبان و بستر جاوا خدمت دوستان  توضیح بدیم .

منظور از برنامه نویسی شبکه  نوشتن برنامه ای برای اجرا و ارسال و دریافت اطلاعات بین چند کامپیوتر که بصورت شبکه بهم متصل هستند هست.  این شبکه میتونه یک شبکه محلی باشه یا شبکه جهانی اینترنت.

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

دو پروتکل مهم لایه سوم شبکه پروتکل TCP و UDP هست  که اساس برنامه نویسیشون با آدرس IP و شماره پورت .

IP : یک  آدرس هست که ایستگاههای داخل شبکه اون رو بعنوان آدرس یکتا در هنگام اتصال به شبکه بصورت دستی یا با سرویس دهنده مخصوصش دریافت میکنن. این آدرس از بخشهای مختلف تشکیل شده  که شامل مواردی مثل آدرس شبکه و آدرس ایتسگاه داخل شبکه و ... هست  مثلا 192.168.1.5 میتونه آدرس استگاه شماره 5 از شبکه 192.168 با شه. IP یک بحث بسیار گسترده هست و کلاسها و انواع مختلف آدرس داریم که اگه میخوایین خوب یاد بگیرین یه نگاه به این بندازید.

PORT : توی یک آدرس IP مشخص  یک سرویس یا نرم افزاری قرار داره که بهش یک درگاه اختصاص دادن و اون نرم افزار یا سرویس میتونه در آدرس مثلا IP 192.168.1.5 با شماره پورت مثلا 8080  با دنیای بیرون ارتباط داشته باشه.

مجموع آدرس IP و PORT یک آدرس به شکل زیر ایجاد میکنن که شکل روبرو رو داره 192.168.1.5:1725 و بهش میگن آدرس سوکت .  و برنامه نویسی رو که بر اسا این ادرس کار کنه رو برنامه نویسی  سوکت  یا  socket programming.

توی جاوا پکیج java.net کلاسها و متدهای مفیدی برای برنامه نویسی سوکت وجود داره که دوتاشون رو در اینجا  استفاده میکنیم.

TCP : یا Transmission Control Protocol یک پروتکل برای ارتباط  قابل اعتماد بین دو برنامه کاربردی هست . این پروتکل برروی پروتکل اینترنت TCP/IP ساخته شده .

UDP : یا  User Datagram Protocol که  یک پروتکل بدون اتصال یا Connection-Less هست و برای ارسال بسته ها بین برنامه های کاربردی استفاده میشه.

برنامه نویسی سوکت :

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

برای کلاینت از کلاس Socket و برای سرور از کلاس ServerSocket استفاده میکنیم . مراحل زیر توی برنامه باید پیاده بشه .

1- سرور یک سوکت با شماره پورت مورد نظر ایجاد میکند

2- سرور متد accept را فراخوانی میکند که منتظر کلاینت برای اتصال میماند

3- کلاینت هم یک شی سوکت ایجاد و به آدرس و پورت تعیین شده به سرور متصل مبشود

4- با ایجاد شی سوکت توسط  کلاینت  با شماره پورت سرور اتصال ایجاد میشود

5- سرور هم از طریق متد accecp پاسخ این اتصال را میدهد

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

کد زیر مربوط به  بخش کلاینت میشه که البته  با یه جستجو میتونید کدهای مشابه و کاملتری رو هم پیدا کنید .

 import java.net.*;
import java.io.*;

public class ClientEst
{
    public static void main(String [] args)
    {
        String serverName = args[0];
        int port = Integer.parseInt(args[1]);
        try
        {
        System.out.println("اتصال به " + serverName + " از پورت " + port);
        //ایجاد شی سوکت برای کلاینت به همراه شماره پورت سرور و هم زمان تلاش برای اتصال
        Socket client = new Socket(serverName, port);
        System.out.println("متصل شد به " + client.getRemoteSocketAddress());
        //ایجاد یک جریان داده برای ارسال داده به سرور
        OutputStream outToServer = client.getOutputStream();
        //ارسال داده ها به سرور
        DataOutputStream out = new DataOutputStream(outToServer);
        out.writeUTF("سلام از " + client.getLocalSocketAddress());
        //دریافت داده از سرور با کلاس inputstream
        InputStream inFromServer = client.getInputStream();
        DataInputStream in =new DataInputStream(inFromServer);
        System.out.println("پیغام سرور " + in.readUTF());
        client.close();
    }catch(IOException e)
    {
        e.printStackTrace();
    }
 }
} 

کد زیر رو هم میتونیم برای سرور داشته باشیم :

 import java.net.*;
import java.io.*;

//تعریف کلاس سرور بصورت یک ترید جداگانه برای اینکه همیشه فعال باشه
public class ServerEst extends Thread
{
    private ServerSocket serverSocket;

    public GreetingServer(int port) throws IOException
    {
        //ایجاد شی سوکت سرور و تعیین پورت مخصوص و نتظیم مدت زمان اتصال
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(10000);
    }

    public void run()
    {
        while(true)
        {
            try
            {
                 System.out.println("منتظر کلاینت بر روی پورت " + serverSocket.getLocalPort() + "...");
                 //ایجاد شی سرور سوکت و شروع گوش دادن به پورت
                 Socket server = serverSocket.accept();
                 System.out.println("متصل شد به " + server.getRemoteSocketAddress());
                 // ایجاد یک شی اینپوت برای دریافت داده از کلاینت
                 DataInputStream in =new DataInputStream(server.getInputStream());
                 System.out.println(in.readUTF());
                 //ارسال داده به کلاینت
                 DataOutputStream out =new DataOutputStream(server.getOutputStream());
                 out.writeUTF("تشکر از اتصال به " + server.getLocalSocketAddress() + "\nGoodbye!");
                 server.close();
    }catch(SocketTimeoutException s)
    {
        System.out.println("Socket timed  out!");
        break;
    }catch(IOException e)
    {
        e.printStackTrace();
        break;
    }
}
}
//متد main اجرای برنامه
public static void main(String [] args)
{
int port = Integer.parseInt(args[0]);
try
{
// ایجاد یک نخ پردازشی جداگانه برای گوش دادن به کلاینت بصورت مداوم 
Thread t = new GreetingServer(port);
t.start();
}catch(IOException e)
{
e.printStackTrace();
}
}
} 

متدهای زیادی برای کار با دو کلاس سوکت مربوط به کلاینت و سرور وجود داره که میتونید از سایتهای tutorialspoint.com و یا java2s.com اونهارو ببینید .

تا جلسه بعد در پناه حق .....


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید