مشخصات مقاله
-
0
-
0.0
-
11001
-
0
-
0
آموزش Java-آموزش Networking Socket Programming در جاوا
عبارت network programming اشاره به برنامه هایی دارد که در راستای چند ابزار اجرا می شود که در آن تمام این ابزار با استفاده از یک شبکه به یکدیگر مرتبط هستند.
پوشه ی java.net از J2SE APIs حاوی مجموعه ای از گروه ها و اینترفیس هاست که جزئیات سطح پایین ارتباط را ارائه می دهد و به شما اجازه ی نوشتن برنامه هایی را می دهد که روی برطرف کردن مشکل موجود تمرکز می کند.
پوشه ی پشتیبانی برای دو پروتکل مشترک شبکه ارائه می دهد:
· TCP: TCP مخفف Transmission Control Protocol می باشد که اجازه ی ارتباطات مجاز بین دو برنامه را می دهد. TCP معمولا در اینترنت پروتکل استفاده می شود که با عنوان TCP/IP مورد اشاره قرار می گیرد.
· UDP: UDP مخفف User Datagram Protocol می باشد، یک پروتکل بدون اتصال که به بسته های داده اجازه می دهد بین برنامه ها تعویض شوند.
این آموزش درک خوبی از موضوعات زیر ارائه می دهد:
· Socket Programming: این مفهوم در Networking بسیار مورد استفاده قرار می گیرد و با جزئیات کامل توضیح داده شده است.
· URL Processing: این برنامه به طور مجزا مورد استفاده قرار می گیرد. اینجا را کلیک کنید تا در مورد URL Processing در زبان جاوا فرا بگیرید.
برنامه نویسی Socket:
Socket ها با استفاده از TCP یک مکانیزم ارتباطی بین دو کامپیوتر برقرار می کنند. برنامه ی یک کاربر در انتهای اتصال خود یک socket ایجاد می کند و سعی می کند تا آن socket را به یک سرور متصل کند.
وقتی اتصال برقرار شد، سرور یک آبجکت socket روی در انتهای ارتباط آن ایجاد می کند. اکنون سرور و کاربر می توانند با نوشتن و خواندن از یک socket با یکدیگر ارتباط برقرار کنند.
گروه java.net.Socket نشان دهنده ی یک socket می باشد و گروه java.net.ServerSocket یک مکانیزم برای برنامه ی سرور ارائه می دهد تا با آنها به کاربران گوش دهند و ارتباط ها را گسترش دهند.
مراحل زیر در هنگام انتشار اتصال یک TCP بین دو کامپیوتر با استفاده از socket ها، اتفاق می افتند:
· سرور یک آبجکت ServerSocket را نمونه گذاری می کند، در حالی که اشاره دارد به اینکه ارتباط کدام پورت قرار است اتفاق بیفتد.
· سرور متود accept() را از گروه ServerSocket درخواست می کند. این متود تا زمانیکه یک کاربر روی پورت ارائه شده به سرور متصل شود، منتظر می ماند.
· پس از انتظار سرور، کاربر یک آبجکت Socket را نمونه گذاری می کند، درحالیکه نام سرور و شماره ی پورت را برای اتصال به آن تعیین می کند.
· سازنده ی گروه Socket سعی می کند کاربر را به سرور تعیین شده و شماره ی پورت متصل کند. اگر این ارتباط منتشر شود، اکنون کاربر دارای یک آبجکت Socket می باشد که توانایی ارباط با سرور را دارد.
· در قسمت سرور متود accept() روی سرور یک ارجاع به socket جدید دارد که به socket کاربر متصل می باشد.
پس از برقراری اتصالات، ارتباط از طریق جریان های I/O اتفاق می افتند. هر socket دارای یک OutputStream و یک InputStream می باشد. OutputStream کاربر به InputStream سرور متصل می باشد و InputStream کاربر به OutputStream سرور متصل است.
TCP یک پروتکل ارتباطی twoway (دو مسیره) است، بنابراین می تواند در راستای دو جریان به طور همزمان ارسال شود. برای اجرای socket ها گروه های مفید زیر مجموعه ای کامل از متودها را ارائه می دهند.
متودهای گروه ServerSocket:
گروه java.net.ServerSocket توسط برنامه های سرور برای برقراری یک پورت و گوش دادن به تقاضاهای کاربر استفاده می شود.
گروه ServerSocket دارای چهارسازنده می باشد:
|
SN |
Methods with Description |
|
1 |
public ServerSocket(int port) throws IOException |
|
2 |
public ServerSocket(int port, int backlog) throws IOException |
|
3 |
public ServerSocket(int port, int backlog, InetAddress address) throws IOException |
|
4 |
public ServerSocket() throws IOException |
If the ServerSocket constructor does not throw an exception, it means that your application has successfully bound to the specified port and is ready for client requests.
Here are some of the common methods of the ServerSocket class:
|
SN |
Methods with Description |
|
1 |
public int getLocalPort() آم پورتی را بازمی گرداند که سرور socket در حال گوش دادن به آن می باشد. اگر شما 0 را به عنوان شماره ی یک سازنده انتقال داده اید و به سرور اجازه دادید که یک پورت برای شما پیدا کند، این متود مفید می باشد. |
|
2 |
public Socket accept() throws IOException برای یک کاربر ورودی منتظر می ماند. این متود مسدود است تا زمانیکه یا یک کاربر روی یک پورت مشخص شده به سرور متصل شود و یا اینکه دوره ی socket به پایان برسد، با فرض اینکه مقدار به پایان رسیده با استفاده از متود setSoTimeout() تنظیم شده است. در غیر این صورت این متود برای همیشه مسدود می شود. |
|
3 |
public void setSoTimeout(int timeout) مقدار time-out را برای مدت زمانی که سرور socket در طول دوره ی accept() برای یک کاربر منتظر می ماند را تنظیم می کند. |
|
4 |
public void bind(SocketAddress host, int backlog) Socket را به سرور مشخص شده محدود می کند و وارد آبجکت SocketAddress می کند. اگر ServerSocket با استفاده از سازنده ی no-argument نمونه گذاری کرده اید، از این متود می توانید استفاده کنید. |
وقتی که accept() توسط ServerSocket درخواست می شود، تا زمانیکه یک کاربر متصل نشود، متود گزارش داده نمی شود. پس از اتصال یک کاربر، ServerSocket یک socket جدید روی یک پورت تعیین نشده ایجاد می کند و یک ارجاع به این Socket جدید بازمی گرداند. اکنون یک اتصال TCP بین کاربر و سرور وجود دارد و ارتباط می تواند آغاز شود.
متودهای گروه socket:
گروه java.net.Socket یک socket را نمایش می دهد که هم کاربر و هم سرور برای ارتباط با یکدیگر از آن استفاده می کنند. کاربر یک آبجکت socket را با نمونه گذاری یک نمونه، برقرار می کند، در حالیکه سرور یک آبجکت Socket را از مقدار گزارش شده ی متود accept() برقرار می کند.
گروه Socket دارای پنج سازنده است که یک کاربر برای اتصال به یک سرور استفاده می کند:
|
SN |
Methods with Description |
|
1 |
public Socket(String host, int port) throws UnknownHostException, IOException. این متود سعی می کند در پورت مشخص شده به سرور تعیین شده متصل شود. اگر این سازنده یک exception وارد نکند، اتصال موفقیت آمیز است و کاربر به سرور متصل می شود. |
|
2 |
public Socket(InetAddress host, int port) throws IOException این متود معرف سازنده ی قبل می باشد، به جز اینکه میزبان (host) توسط یک آبجکت InetAddress مورد اشاره قرار می گیرد. |
|
3 |
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. به host و پورت تعیین شده متصل می شود، در حالیکه روی host داخلی در آدرس و پورت تعیین شده یک socket ایجاد می کند. |
|
4 |
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. این متود معرف سازنده ی قبل می باشد، به جز اینکه میزبان به جای یک رشته (String) توسط یک آبجکت InetAddress مورد اشاره قرار می گیرد. |
|
5 |
public Socket() یک socket غیر متصل ایجاد می کند. از متود connect() برای اتصال این socket به سرور استفاده می کند. |
وقتی که سازنده ی Socket بازگردانده می شود، به سادگی یک آبجکت Socket نمونه گذاری نمی کند اما در واقع سعی می کند به سرور و پورت مشخص شده متصل شود.
برخی از متودهای جالب در گروه Socket در اینجا لیست شده اند. دقت داشته باشید که هم سرور و هم آبجکت دارای آبجکت Socket می باشند، بنابراین این متودها می توانند هم توسط کاربر و هم توسط سرور داخواست شوند.
|
SN |
Methods with Description |
|
1 |
public void connect(SocketAddress host, int timeout) throws IOException این متود socket را به میزبان (host) تعیین شده متصل می کند. این متود تنها زمانی مورد نیاز است که شما Socket را با استفاده از سازنده ی no-argument نمونه گذاری می کنید. |
|
2 |
public InetAddress getInetAddress() این متود آدرس کامپیوتر دیگر را که این socket به آن متصل است را بازمی گرداند. |
|
3 |
public int getPort() پورتی را که socket به آن در یک ماشین دیگر متصل شده است بازمی گرداند. |
|
4 |
public int getLocalPort() پورتی را که socket به آن در یک ماشین داخلی متصل شده است بازمی گرداند. |
|
5 |
public SocketAddress getRemoteSocketAddress() آدرس مربوط به socket دور از دسترس را گزارش می دهد. |
|
6 |
public InputStream getInputStream() throws IOException جریان ورودی socket را گزارش می دهد. جریان ورودی به جریان خروجی روی یک socket دورتر متصل می باشد. |
|
7 |
public OutputStream getOutputStream() throws IOException جریان خروجی socket را گزارش می دهد. جریان خروجی به جریان ورودی socket دورتر متصل می باشد. |
|
8 |
public void close() throws IOException آن socket را که باعث می شود که آبجکت Socket دیگر قابلیت اتصال مجدد به هیچ سروری را نداشته باشد، می بندد. |
متودهای گروه InetAddress:
این گروه یک آدرس Internet Protocol (IP) را ارائه می دهد. در اینجا متودهای مفیدی را مشاهده می کنید که در هنگام برنامه نویسی socket نیاز خواهند بود:
|
SN |
Methods with Description |
|
1 |
static InetAddress getByAddress(byte[] addr) یک آبجکت InetAddress را گزارش می دهد که آدرس ردیف IP را ارائه می دهد. |
|
2 |
static InetAddress getByAddress(String host, byte[] addr) یک InetAddress براساس نام host ارائه شده و آدرس IP ارائه می دهد. |
|
3 |
static InetAddress getByName(String host) آدرس IP مربوط به یک host را تعیین می کند، نام host را ارائه می دهد. |
|
4 |
String getHostAddress() آدرس IP مربوط به رشته را در یک نمایش متنی ارائه می دهد. |
|
5 |
String getHostName() نام host را برای این آدرس IP به دست می آورد. |
|
6 |
static InetAddress InetAddress getLocalHost() Host داخلی را گزارش می دهد. |
|
7 |
String toString() آدرس IP را به یک رشته تغییر می دهد. |
مثال مربوط به کاربر Socket:
GreetingClient زیر یک برنامه ی کاربر می باشد که با استفاده از یک socket به یک سرور متصل می شود و پیام احوالپرسی می فزستد و سپس منتظر پاسخ می ماند.
// 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();
}
}
}
مثال Socket Server:
برنامه ی GreetingServer زیر مثالی از یک برنامه ی سرور می باشد که از گروه Socket برای گوش دادن به کاربران روی شماره ی یک پورت استفاده می کند که این شماره به وسیله ی فرمان خطی تعیین می شود:
// 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();
}
}
}
کاربر و سرور را کامپایل کرده و سپس سرور را مانند زیر آغاز می کند:
$ java GreetingServer 6066
Waiting for client on port 6066...
برنامه ی کاربر را مانند زیر چک می کند:
$ 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!