mohsensaghafi
دوشنبه 11 شهریور 1387, 13:54 عصر
در برخی برنامه لازم می شود که عمل یا اعمالی بصورت کاملا همزمان انجام شوند. برای مثال می توانید به مثالی که دوست عزیزم، میثم، در مورد موضوع چت (http://barnamenevis.org/forum/showthread.php?t=119875) آورده اند اشاره کرد.
اگر بخواهیم دو کار را بصورت همزمان انجام دهیم، راه حل آن در Java ترد ها هستند. در Java یک کلاس بنام Thread وجود دارد که برای ایجاد ترد های مختلف باید از این کلاس استفاده کرد. طرز نوشتن یک ترد به این صورت است.
ابتدا باید یک کلاس تعریف کنیم که این کلاس، از کلاس Thread را ارث بری کند.
class MyClass extends Thread{
}
با تعریف این کلاس ما می توانیم از امکانات ترد استفاده کنیم. برای اجرای ترد بصورت همزمان با برنامه خود، کافی ست که یک نمونه از این کلاس تعریف کنیم.
MyClass obj=new MyClass();
با این کار یک نمونه از آن شیء ساخته می شود. برای اجرای این ترد کافیست که از دستور زیر استفاده کنیم.
obj.start();
با این دستور کلاس obj بصورت همزمان با برنامه ای که در حال حاضر در حال اجرای آن هستیم، اجرا می شود.
برای اجرا، جاوا به سراغ تابعی بنام run می رود.
در پیاده سازی کلاس باید کار هایی را که می خواهیم در زمان همزمانی اجرا شود، در این تابع نوشته شود.
public void run(){
…
}
مثال:
برای مثال به سراغ همان برنامه چتی می رویم که در ابتدا شرح داده شد. در همان تاپیک مشکل بصورت کامل شرح داده شده است.
در اینجا در پی راه حل این موضوع هستیم.
در این برنامه چت، دو کار باید بصورت همزمان انجام شود. یکی ارسال پیام، و دیگری انتضار برای دریافت پیام از طرف دیگر می باشد. پس برای انجام این دو کار، نیاز به دو کلاس جداگانه داریم. یکی برای ارسال پیام ها و دیگری برای دریافت پیام ها.
ابتدا کد سمت سرور:
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class ServerChat {
public static void main(String[] args) throws Exception {
// TODO, add your application code
System.out.println("Server is runing...");
System.out.println("Wating for client...");
ServerSocket socket =new ServerSocket(1362);
Socket client=socket.accept();
System.out.println("New Client Accepted.");
System.out.println("Chat is Started.");
DataInputStream in=new DataInputStream(client.getInputStream());
DataOutputStream out=new DataOutputStream(client.getOutputStream());
Resieved res=new Resieved(in);
Send send=new Send(out);
res.start();
send.start();
}
}
class Resieved extends Thread{
private DataInputStream in;
public Resieved(DataInputStream in1){
in=in1;
}
public void run(){
String message="";
while(true){
try{
message=in.readUTF();
System.out.println("\t\tClient > "+message);
}
catch(IOException g)
{
}
}
}
}
class Send extends Thread{
private DataOutputStream out;
public Send(DataOutputStream o1){
out=o1;
}
public void run(){
String message="";
Scanner s=new Scanner(System.in);
while(true){
try{
message=s.nextLine();
out.writeUTF(message);
System.out.println("\t\tServer > "+message);
}
catch(IOException g)
{
}
}
}
}در این برنامه سمت سرور، ابتدا برقراری ارتباطات نوشته شده است. در مقاله ارتباط TCP در جاوا این کانکشن توضیح داده شده است. سپس دو شی از کلاس های Send و Received ساخته شده و تابع start() آنها صدا زده شده است. با این کار توابع run() آنها بصورت اتوماتیک اجرا می شود. در آن توابع هم در یک حلقه، یکی منتظر دریافت پیام است و دیگری منتظر برای گرفتن ورودی و ارسال پیام می باشد.
برنامه سمت کلاینت:
این برنامه، کاملا مشابه برنامه سمت سرور است. با این تفاوت که در ایجاد کانکشن تفاوت دارد.
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class ClientChat {
public static void main(String[] args) throws Exception {
// TODO, add your application code
System.out.println("Client is runing...");
System.out.println("goto rend request.");
InetAddress serverip=InetAddress.getLocalHost();
Socket server=new Socket(serverip,1362);
System.out.println("Connected to the Server");
System.out.println("Chat is Started.");
DataInputStream in=new DataInputStream(server.getInputStream());
DataOutputStream out=new DataOutputStream(server.getOutputStream());
Resieved res=new Resieved(in);
Send send=new Send(out);
//Thread res_thread=new Thread(res);
//Thread send_thread=new Thread(send);
res.start();
send.start();
}
}
class Resieved extends Thread{
private DataInputStream in;
public Resieved(DataInputStream in1){
in=in1;
}
public void run(){
String message="";
while(true){
try{
message=in.readUTF();
System.out.println("\t\tServer > "+message);
}
catch(IOException g)
{
}
}
}
}
class Send extends Thread{
private DataOutputStream out;
public Send(DataOutputStream o1){
out=o1;
}
public void run(){
String message="";
Scanner s=new Scanner(System.in);
while(true){
try{
message=s.nextLine();
out.writeUTF(message);
System.out.println("\t\tClient > "+message);
}
catch(IOException g)
{
}
}
}
}در این برنامه ، مراحل چت تکمیل شده است. اما هنوز هم مشکلاتی وجود دارد؟!
اگر بخواهیم دو کار را بصورت همزمان انجام دهیم، راه حل آن در Java ترد ها هستند. در Java یک کلاس بنام Thread وجود دارد که برای ایجاد ترد های مختلف باید از این کلاس استفاده کرد. طرز نوشتن یک ترد به این صورت است.
ابتدا باید یک کلاس تعریف کنیم که این کلاس، از کلاس Thread را ارث بری کند.
class MyClass extends Thread{
}
با تعریف این کلاس ما می توانیم از امکانات ترد استفاده کنیم. برای اجرای ترد بصورت همزمان با برنامه خود، کافی ست که یک نمونه از این کلاس تعریف کنیم.
MyClass obj=new MyClass();
با این کار یک نمونه از آن شیء ساخته می شود. برای اجرای این ترد کافیست که از دستور زیر استفاده کنیم.
obj.start();
با این دستور کلاس obj بصورت همزمان با برنامه ای که در حال حاضر در حال اجرای آن هستیم، اجرا می شود.
برای اجرا، جاوا به سراغ تابعی بنام run می رود.
در پیاده سازی کلاس باید کار هایی را که می خواهیم در زمان همزمانی اجرا شود، در این تابع نوشته شود.
public void run(){
…
}
مثال:
برای مثال به سراغ همان برنامه چتی می رویم که در ابتدا شرح داده شد. در همان تاپیک مشکل بصورت کامل شرح داده شده است.
در اینجا در پی راه حل این موضوع هستیم.
در این برنامه چت، دو کار باید بصورت همزمان انجام شود. یکی ارسال پیام، و دیگری انتضار برای دریافت پیام از طرف دیگر می باشد. پس برای انجام این دو کار، نیاز به دو کلاس جداگانه داریم. یکی برای ارسال پیام ها و دیگری برای دریافت پیام ها.
ابتدا کد سمت سرور:
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class ServerChat {
public static void main(String[] args) throws Exception {
// TODO, add your application code
System.out.println("Server is runing...");
System.out.println("Wating for client...");
ServerSocket socket =new ServerSocket(1362);
Socket client=socket.accept();
System.out.println("New Client Accepted.");
System.out.println("Chat is Started.");
DataInputStream in=new DataInputStream(client.getInputStream());
DataOutputStream out=new DataOutputStream(client.getOutputStream());
Resieved res=new Resieved(in);
Send send=new Send(out);
res.start();
send.start();
}
}
class Resieved extends Thread{
private DataInputStream in;
public Resieved(DataInputStream in1){
in=in1;
}
public void run(){
String message="";
while(true){
try{
message=in.readUTF();
System.out.println("\t\tClient > "+message);
}
catch(IOException g)
{
}
}
}
}
class Send extends Thread{
private DataOutputStream out;
public Send(DataOutputStream o1){
out=o1;
}
public void run(){
String message="";
Scanner s=new Scanner(System.in);
while(true){
try{
message=s.nextLine();
out.writeUTF(message);
System.out.println("\t\tServer > "+message);
}
catch(IOException g)
{
}
}
}
}در این برنامه سمت سرور، ابتدا برقراری ارتباطات نوشته شده است. در مقاله ارتباط TCP در جاوا این کانکشن توضیح داده شده است. سپس دو شی از کلاس های Send و Received ساخته شده و تابع start() آنها صدا زده شده است. با این کار توابع run() آنها بصورت اتوماتیک اجرا می شود. در آن توابع هم در یک حلقه، یکی منتظر دریافت پیام است و دیگری منتظر برای گرفتن ورودی و ارسال پیام می باشد.
برنامه سمت کلاینت:
این برنامه، کاملا مشابه برنامه سمت سرور است. با این تفاوت که در ایجاد کانکشن تفاوت دارد.
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class ClientChat {
public static void main(String[] args) throws Exception {
// TODO, add your application code
System.out.println("Client is runing...");
System.out.println("goto rend request.");
InetAddress serverip=InetAddress.getLocalHost();
Socket server=new Socket(serverip,1362);
System.out.println("Connected to the Server");
System.out.println("Chat is Started.");
DataInputStream in=new DataInputStream(server.getInputStream());
DataOutputStream out=new DataOutputStream(server.getOutputStream());
Resieved res=new Resieved(in);
Send send=new Send(out);
//Thread res_thread=new Thread(res);
//Thread send_thread=new Thread(send);
res.start();
send.start();
}
}
class Resieved extends Thread{
private DataInputStream in;
public Resieved(DataInputStream in1){
in=in1;
}
public void run(){
String message="";
while(true){
try{
message=in.readUTF();
System.out.println("\t\tServer > "+message);
}
catch(IOException g)
{
}
}
}
}
class Send extends Thread{
private DataOutputStream out;
public Send(DataOutputStream o1){
out=o1;
}
public void run(){
String message="";
Scanner s=new Scanner(System.in);
while(true){
try{
message=s.nextLine();
out.writeUTF(message);
System.out.println("\t\tClient > "+message);
}
catch(IOException g)
{
}
}
}
}در این برنامه ، مراحل چت تکمیل شده است. اما هنوز هم مشکلاتی وجود دارد؟!