PDA

View Full Version : برنامه نویسی سوکت در جاوا و اندروید



javadshaahin
پنج شنبه 15 بهمن 1394, 01:19 صبح
دوستان و اساتید سلام و عرض ادب

با عرض پوزش بنده در حال نوشتن یه برنامه هستم که با جاوا طراحی میشه

به این روال که کلا توش نیاز دارم یک برنامه ی اصلی که سرور هستش و رو pc نصب میشه برای 6 پلتفورم که موبایل اندرویدی هستن اطلاعاتی رو میفرسته
و این ها بعد از یک سری تغییرات در اعداد مجدد به سرور بر میگردانند

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

ازتون ممنون میشم فایل اموزشی یا داکیومنتی مبنی بر اینکه کار بنده رو راه بندازه معرفی کنید
بسیار سپاس گذارم

محمد فدوی
پنج شنبه 15 بهمن 1394, 10:21 صبح
یه جستجو بکنی آموزش و راهنما زیاد هست.. ببین (http://ddg.gg/q=java+socket+programming)
مثلا این (http://www.buyya.com/java/Chapter13.pdf) شاید بد نباشن.

javadshaahin
چهارشنبه 21 بهمن 1394, 22:24 عصر
یه جستجو بکنی آموزش و راهنما زیاد هست.. ببین (http://ddg.gg/q=java+socket+programming)
مثلا این (http://www.buyya.com/java/Chapter13.pdf) شاید بد نباشن.


به خدا من هرچی میگردم نیست شمارو به خدا میشه یه سورس بهم بدید که یه رشته رو از netbeans بگیره بفرسته سمت eclipse و برعکس
من مشکلم فقط همینه شمارو به خدا کمکم کنید ممنونتون میشم

محمد فدوی
پنج شنبه 22 بهمن 1394, 10:09 صبح
به خدا من هرچی میگردم نیست شمارو به خدا میشه یه سورس بهم بدید که یه رشته رو از netbeans بگیره بفرسته سمت eclipse و برعکس
من مشکلم فقط همینه شمارو به خدا کمکم کنید ممنونتون میشم
پیوندهایی که دادم رو ببین. یکیش یه PDF در همین مورده و اون یکی هم نتیجهٔ جستجو که ببینی چقدر مطلب هست در این مورد!

javadshaahin
پنج شنبه 22 بهمن 1394, 15:15 عصر
پیوندهایی که دادم رو ببین. یکیش یه PDF در همین مورده و اون یکی هم نتیجهٔ جستجو که ببینی چقدر مطلب هست در این مورد!

برادر و استاد گرامی بنده زبانم ضعیفه اینم حتما باس بگم ؟
یعنی مشخص نبود ؟
با مترجم هم ادم متوجه نمیشه چی میگه

ahmad.mo74
دوشنبه 09 فروردین 1395, 08:05 صبح
سلام.

دوستان درست میفرمایند، آموزش در مورد socket programming به خصوص برای جاوا زیاده.

من یه مثال ساده Echo Server نوشتم تا با نحوه کارکرد Socket توی جاوا آشنا بشین.
به این صورت که سرور منتظر کانکشن از طرف کلاینت ها میشه و هر دیتایی که از کلاینت گرفت همون رو برمیگردونه سمت کلاینت.

کلاس EchoServer :


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;


/**
* @author ahmad
*/
public class EchoServer implements Runnable, AutoCloseable {


private final int port;
private final AtomicBoolean open = new AtomicBoolean();


private ServerSocket serverSocket;


public EchoServer(int port) {
this.port = port;
}


public boolean isOpen() {
return open.get();
}


@Override
public void run() {
if (open.compareAndSet(false, true)) {
ExecutorService es = null;
try {
serverSocket = new ServerSocket(port);
System.out.println("Server is running on port " + port);


es = Executors.newCachedThreadPool();


while (!Thread.currentThread().isInterrupted() && open.get()) {
try {


// wait for incoming connections
Socket socket = serverSocket.accept();
SocketAddress remoteAddress = socket.getRemoteSocketAddress();


System.out.println("ACCEPTED [ " + remoteAddress + "]");


// handle the newly accepted connection
es.execute(new EchoHandler(socket, remoteAddress));
} catch (IOException e) {
System.err.println(e.getMessage());
}
}


} catch (IOException e) {
e.printStackTrace();
} finally {
close();
if (es != null) {
es.shutdown();
}
}
} else {
throw new IllegalStateException("Server is already running...");
}
}


@Override
public void close() {
if (open.compareAndSet(true, false)) {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException ignored) {
}
serverSocket = null;
}
}
}


private final class EchoHandler implements Runnable {


private final Socket socket;
private final SocketAddress remoteAddress;


private EchoHandler(Socket socket, SocketAddress remoteAddress) {
this.socket = socket;
this.remoteAddress = remoteAddress;
}


@Override
public void run() {
try (DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {
while (!Thread.currentThread().isInterrupted() && open.get()) {
// wait for input data
String data = dataInputStream.readUTF();
System.out.println("[" + remoteAddress + "] : " + data);


// echo back data
dataOutputStream.writeUTF(data);
dataOutputStream.flush();
}
} catch (IOException e) {
System.err.println("[" + remoteAddress + "] CLOSED. due to : " + e.getMessage());
}
}


}


public static void main(String[] args) throws IOException {
try (EchoServer server = new EchoServer(14141)) {
new Thread(server).start();
System.in.read();
}
}


}




برای سمت سرور باید از کلاس ServerSocket استفاده بشه و متد accpet منتظر کانکشن از طرف کلاینت ها میمونه.
خروجی این متد یک Socket هست که میتونید از طریق input و output استریم هایی که در اختیارتون قرار میده دیتا ارسال و دریافت کنید.

برای متصل شدن به سرور، باید از کلاس Socket استفاده کنید و باز هم از I/O Stream ها استفاده کنید برای انتقال دیتا.

SocketTest :


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;


/**
* @author ahmad
*/
public class SocketTest {


public static void main(String[] args) {
// trying to connect to the server
try (Socket socket = new Socket("localhost", 14141);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {


System.out.println("CONNECTED [" + socket.getRemoteSocketAddress() + "]");


try (Scanner scanner = new Scanner(System.in)) {
while (scanner.hasNextLine()) {
// send user input to the server
dataOutputStream.writeUTF(scanner.nextLine());
dataOutputStream.flush();


// wait for server response
System.out.println("SERVER : " + dataInputStream.readUTF());
}
}


} catch (IOException e) {
System.err.println("CONNECTION LOST. due to : " + e.getMessage());
}
}


}




یادگیری socket programming از واجبات هست و یک جاوا کار باید تا حد کافی تسلط داشته باشه روی مبحث socket programming.
اما توصیه ای که میشه این هست که تا جایی که امکان داره از کلاس های low level استفاده نکنید (یعنی همین ServerSocket و Socket) چون احتمال خطا توسط برنامه نویسی که تجربه کافی کار با socket هارو نداره و با پروتکل های انتقال داده آشنایی نداره همیشه وجود داره.
و اینکه برای نرم افزار های بزرگ تر و پیچیده تر کار به همین راحتی نیست و پیچیدگی های زیادی اضافه میشه که مدیریت کردنش چه توسط برنامه نویس مبتدی و چه با تجربه سخت میشه.

حتما سراغ non-blocking io هم برید و با کلاس های ServerSockerChannel و SocketChannel هم کار کنید.
در واقع best practice همین هست که با این کلاس های low level کار کنید و قطعا هر چی کار ساده تر باشه و از فریم ورک های کمتری استفاده کنید (یعنی لایه های abstraction کمتری داشته باشید) به performance بیشتری میرسید. (در صورتی که از معماری صحیحی استفاده کنید چه برای مدیریت کانکشن ها و چه برای مدیریت thread ها و...)

من خودم فریم ورک Netty (http://netty.io/) رو پیشنهاد میکنم چون هم از NIO استفاده میکنه و هم asynchronous io رو ساپورت میکنه. فوق العاده performance بالایی داره و API ساده و روونی داره که در مقایسه با کلاس های low level تر کار باهاش آسون تر و لذت بخش تره و 100 البته قابل اطمینان تر.
فریم ورک دیگه ای که پیشنهاد میکنم Vert.x (http://vertx.io/) هست که اونم بر پایه Netty نوشته شده که علاوه بر performance بالا امکانات خیلی بیشتری رو هم در اختیارتون میذاره.