با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن. و کاربرانی که دوره کامل آموزش برنامه نویسی جاوا را دنبال می کنند. network programming (برنامه نویسی شبکه) به برنامه نویسی که در بین دستگاه های مختلف (رایانه) اجرا می شود اشاره می کند. که در آن دستگاه ها با استفاده از یک شبکه به یکدیگر متصل می شوند. بسته java.net از API های J2SE حاوی مجموعه ای از کلاس ها و اینترفیس هایی است که جزئیات ارتباطات سطح پایین را فراهم می کنند، به شما این امکان را می دهد که برنامه هایی بنویسید که بر روی حل یک مسئله متمرکز باشد. برای آشنایی با چگونگی کار با شبکه در جاوا در ادامه ی مباحث این بخش با ما همراه باشید.
در ادامه ی مباحث برای درک چگونگی کار با شبکه در جاوا به کلاس ها و متدهای کدنویسی سوکت اشاره می کنیم.
بسته java.net از دو پروتکل شبکه مشترک پشتیبانی می کند:
TCP مخفف Transmission Control Protocol ( پروتکل کنترل انتقال) است که اجازه برقراری ارتباط بین دو برنامه را می دهد.
TCP معمولا بر روی پروتکل اینترنتی استفاده می شود که به عنوان TCP / IP نامیده می شود.
UDP برای پروتکل دیتاگرام کاربر، یک پروتکل بدون اتصال است که اجازه می دهد تا بسته های داده ها بین برنامه ها انتقال یابد.
در این بخش به بررسی دو موضوع زیر می پردازیم:
این مفهوم به طور گسترده ای در شبکه استفاده شده و در ادامه آن را بررسی می کنیم.
این گزینه در مورد پردازش آدرس ها است.
سوکتها مکانیزم ارتباطی بین دو کامپیوتر را با استفاده از TCP ارائه می دهند.
برنامه های مشتری یک سوکت در انتهای ارتباط خود ایجاد کرده و تلاش می کند که این سوکت را به یک سرور وصل کند.
وقتی اتصال برقرار می شود، سرور یک شیء سوکت را در انتهای ارتباط برقرار می کند.
مشتری و سرور هم اکنون می توانند با نوشتن و خواندن از سوکت ارتباط برقرار کنند.
کلاس java.net.Socket یک سوکت را نشان می دهد.
کلاس java.net.ServerSocket مکانیزمی برای برنامه سرور برای گوش دادن به مشتریان و ایجاد ارتباط با آنها فراهم می کند.
مراحل زیر هنگام ایجاد اتصال TCP بین دو کامپیوتر با استفاده از سوکت انجام می شود :
پس از برقراری ارتباط، ارتباطات می تواند با استفاده از جریان های I / O رخ دهد و هر سوکت دارای OutputStream و InputStream است.
OutputStream مشتری به InputStream سرور متصل است، و InputStream مشتری به OutputStream سرور متصل است.
TCP یک پروتکل ارتباطی دو طرفه است، بنابراین داده ها در هر دو جریان می توانند در یک زمان ارسال شوند.
در زیر کلاس های مفیدی که مجموعه ی کاملی از متدها را برای پیاده سازی سوکت ارائه می دهند را شامل می شود.
کلاس java.net.ServerSocket توسط برنامه های کاربردی سرور برای به دست آوردن یک پورت و گوش دادن به درخواست های مشتری استفاده می شود.
کلاس ServerSocket شامل ۴ سازنده ی زیر است :
ردیف | متد و توضیحات |
---|---|
۱ | public ServerSocket(int port) throws IOException تلاش می کند یک سوکت سرور متصل به پورت مشخص شده ایجاد کند. اگر پورت قبلا توسط یک برنامه دیگر محدود شده باشد، خطا رخ می دهد. |
۲ | public ServerSocket(int port, int backlog) throws IOException همانند سازنده قبلی، پارامتر backlog مشخص می کند که تعداد مشتری های ورودی چگونه در یک صف منتظر ذخیره می شوند. |
۳ | public ServerSocket(int port, int backlog, InetAddress address) throws IOException همانند سازنده قبلی، پارامتر InetAddress آدرس IP محلی را برای اتصال به آدرس مشخص می کند. InetAddress برای سرورهایی که ممکن است چندین آدرس IP داشته باشند، به کار می رود. به سرور اجازه می دهد تا مشخص کند کدام آدرس IP خود را برای قبول درخواست های مشتری در آن استفاده می شود. |
۴ | public ServerSocket() throws IOException یک سوکت سرور غیر مجاز را ایجاد می کند.هنگام اتصال به سرور سوکت، از متد () bind استفاده کنید.. |
اگر سازنده ی ServerSocket خطایی صادر نکند این به این معنی است که برنامه با موفقیت به پورت متصل شده است.
جدول زیر شامل متدهای معمول کلاس ServerSocket است:
ردیف | متد و توضیحات |
---|---|
۱ | public int getLocalPort() این متد پورتی را باز می کند که سازنده ی سرور به آن گوش می دهد. |
۲ | public Socket accept() throws IOException این متد منتظر می ماند تا زمانکیه که یک مشتری به سرور در پورت مشخص شده متصل شود. |
۳ | public void setSoTimeout(int timeout) مدت زمانیکه نیاز است تا مشتری به پورت مشخص شده متصل شود را تعیین می کند. |
۴ | public void bind(SocketAddress host, int backlog) سوکت را به سرور مشخص شده و پورت در شی SocketAddress متصل می کند. |
پس از اینکه یک مشتری اتصال می کند، ServerSocket یک سوکت جدید را بر روی یک پورت نامشخص ایجاد می کند.
سپس یک اشاره به این سوکت جدید را می دهد. اتصال TCP در حال حاضر بین مشتری و سرور وجود دارد، و ارتباط می تواند شروع شود.
کلاس java.net.Socket نشان دهنده سوکتی است که هر دو سرویس گیرنده و سرور برای برقراری ارتباط با یکدیگر استفاده می کنند.
سرور یک شیء سوکت را از مقدار بازگشتی از متد ()accept دریافت می کند.
کلاس سوکت دارای پنج سازنده است که یک مشتری برای اتصال به سرور از آن استفاده می کند:
ردیف | متد و توضیحات |
---|---|
۱ | public Socket(String host, int port) throws UnknownHostException, IOException. این متد برای اتصال به سرور مشخص شده در پورت مشخص شده تلاش می کند. |
۲ | public Socket(InetAddress host, int port) throws IOException این متد با سازنده قبلی مشابه است، به جز اینکه میزبان با یک شیء InetAddress مشخص می شود. |
۳ | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. به میزبان و پورت مشخص شده متصل می شود و سوکتی در میزبان محلی در آدرس و پورت مشخص شده ایجاد می کند. |
۴ | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. این متد با سازنده قبلی مشابه است، به جز اینکه میزبان با یک شیء InetAddress به جای یک رشته مشخص می شود. |
۵ | public Socket() یک سوکت اتصال غیرمجاز ایجاد می کند. از متد () connect برای اتصال این سوکت به سرور استفاده کنید. |
برخی از متد های مورد علاقه در کلاس سوکت در اینجا فهرست شده است.
توجه داشته باشید که هر دو سرویس دهنده و سرور یک شی Socket دارند، بنابراین این متدها می تواند توسط هر دو استفاده شود.
ردیف | متد و توضیحات |
---|---|
۱ | public void connect(SocketAddress host, int timeout) throws IOException این متد فقط زمانی مورد نیاز است که Socket را با استفاده از سازنده بدون آرگومان بازیابی کنید. |
۲ | public InetAddress getInetAddress() این متد نشانی از رایانه دیگری را که این سوکت به آن متصل است، می فرستد. |
۳ | public int getPort() پورت سوکت را بر روی دستگاه از راه دور متصل می کند. |
۴ | public int getLocalPort() پورت سوکت را بر روی دستگاه محلی متصل می کند. |
۵ | public SocketAddress getRemoteSocketAddress() آدرس سوکت راه دور را برمی گرداند. |
۶ | public InputStream getInputStream() throws IOException stream ورودی سوکت را برمی گرداند. stream ورودی به stream خروجی سوکت راه دور وصل شده است. |
۷ | public OutputStream getOutputStream() throws IOException stream خروجی سوکت را برمی گرداند. stream خروجی به stream ورودی سوکت راه دور وصل شده است. |
۸ | public void close() throws IOException یک سوکت را خاموش می کند،و این شیء سوکت دیگر قادر به اتصال دوباره به هر سرور نیست. |
این کلاس نشان دهنده یک پروتکل اینترنت (IP) است. در زیر متد های مفید زیر را که در هنگام انجام برنامه نویسی سوکت مورد نیاز است را دنبال کنید:
ردیف | متد و توضیحات |
---|---|
۱ | static InetAddress getByAddress(byte[] addr) با توجه به آدرس IP خام، یک شیء InetAddress را باز می گرداند. |
۲ | static InetAddress getByAddress(String host, byte[] addr) یک InetAddress را براساس نام میزبان ارائه شده و آدرس IP ایجاد می کند. |
۳ | static InetAddress getByName(String host) با توجه به نام میزبان، آدرس IP یک میزبان را تعیین می کند. |
۴ | String getHostAddress() رشته آدرس IP را در نمایش متن ارائه می دهد. |
۵ | String getHostName() نام میزبان برای این آدرس IP را دریافت می کند. |
۶ | static InetAddress InetAddress getLocalHost() میزبان محلی را بازگرداند. |
۷ | String toString() آدرس IP را به یک رشته تبدیل می کند. |
GreetingClient زیر یک برنامه سرویس دهنده است که با استفاده از یک سوکت به یک سرور متصل می شود.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // File Name GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); } catch (IOException e) { e.printStackTrace(); } } } |
برنامه GreetingServer زیر نمونه ای از یک برنامه سرور است که با استفاده از کلاس سوکت برای گوش دادن به مشتریان در شماره پورت مشخص شده است:
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | // File Name GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer 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("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); } catch (SocketTimeoutException s) { System.out.println("Socket timed out!"); break; } catch (IOException e) { e.printStackTrace(); break; } } } 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(); } } } |
کامپایل کلاینت و سرور را بصورت زیر شروع کنید:
1 2 | $ java GreetingServer 6066 Waiting for client on port 6066... |
نتیجه ی اجرای کد فوق بصورت زیر خواهد بود:
1 2 3 4 5 | $ java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye! |
یکی از قابلیت های ویژه ی زبان جاوا امکان کدنویسی شبکه برای ارتباط بین دو یا چند سیستم است. با استفاده از قابلیت کار با شبکه در جاوا و کد نویسی سوکت امکان اجرای برنامه ها روی بستر شبکه فراهم می شود.
رضا
مطلب خوبی بود. ولی اگه یک مثال پیشرفته تر میزدید بهتر میشد
علی اصغری
این مطالب بیشتر سطح مقدماتی رو پوشش میدن و طوری در نظر گرفته شده که برای افرادی که میخوان از صفر شروع کنن هم مناسب باشن ، به زودی دوره های پیشرفته تر هم در سایت قرار خواهد گرفت.
نگین
سلام ببخشید من این پورت رو متوجه نمی شم از کجا تعیین می شه!؟یعنی یک عدد رندومه؟