PDA

View Full Version : ارسال فایل بین دستگاه



badname
سه شنبه 13 آبان 1393, 16:31 عصر
سلام دوستان خسته نباشید
با چی روشی میشه بین دو یا چند دستگاه از طریق اینترنت ارتباط برقرار کرد و فایل ارسال کرد .... مقصودم فقط ارسال فایل (با اندازه تقریبی 10 مگ ) هست از طریق IP ، دوستان کسی میتونه راهنمایی کنه ؟:لبخندساده:

MSHService
سه شنبه 13 آبان 1393, 23:08 عصر
درود دوست عزیز

من یک روش بهتون پیشنهاد میکنم ، من اگه بخوام این کارو کنم از این روش استفاده خواهم کرد.

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

باز هم نظره بقه بچه ها رو بپرس

tux-world
سه شنبه 13 آبان 1393, 23:16 عصر
نرم افزارهای زیادی هستن یکی الان تو ذهنمه که اسمش zapya هستش. نرم افزار بسیار قدرتمندی هستش

badname
چهارشنبه 14 آبان 1393, 10:51 صبح
درود دوست عزیز

من یک روش بهتون پیشنهاد میکنم ، من اگه بخوام این کارو کنم از این روش استفاده خواهم کرد.

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

باز هم نظره بقه بچه ها رو بپرس

درود
منم دقیقا دنبال همچین چیزی هستم ، با سوکت کار کردم قبلا برای ارسال مسیج منتحی ارسال فایل رو نمیدونم چجوری انجام بدم ، میشه بیشتر راهنمایی کنید که چجوری انجام میشه ؟ با تشکر:لبخندساده:
(مهم ام هست که فایل قطع نشه یا از ادامه قطع شده ارسال شه)

badname
چهارشنبه 14 آبان 1393, 10:54 صبح
نرم افزارهای زیادی هستن یکی الان تو ذهنمه که اسمش zapya هستش. نرم افزار بسیار قدرتمندی هستش
سلام دوست عزیز اینجا انجمن برنامه نویسی هست نه مارکت ، دنبال ساخت برنامه هستیم نه استفاده :لبخندساده:

tux-world
چهارشنبه 14 آبان 1393, 21:46 عصر
خوب شما هم نگفتید که برای کد نویسی میخوایید من اینطوری از تاپیکتون فهمیدم و هیچ گونه مارک پرسشی تو تاپیک شما دیده نمیشه

badname
جمعه 16 آبان 1393, 13:05 عصر
خوب شما هم نگفتید که برای کد نویسی میخوایید من اینطوری از تاپیکتون فهمیدم و هیچ گونه مارک پرسشی تو تاپیک شما دیده نمیشه
اشکالی نداره :لبخندساده:

دوستان ، اساتید، سوکت کارای حرفه ای کسی نمیتونه راهنمایی کنه ؟ :لبخند:

ahmad.mo74
چهارشنبه 21 آبان 1393, 16:30 عصر
سلام، من یک مثال ساده نوشتم با nio به این صورت که اول باید کسی که فایل رو دریافت میکنه در حال listen کردن باشه و بعدش ip و port گیرنده رو میدی به کسی که میخواد فایل رو بفرسته و اونم شروع میکنه به فرستادن فایل، سایز buffer هم بهترین حالتش همین 64kb بود که باز میتونی خودت تغییرش بدی ولی همون 64kb مناسب هست.

FileReceiver :


import javax.swing.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;


/**
* @author avb
*/
public class FileReceiver implements Runnable {


private final int port;
private final String saveTo;
private final int t = 500;
private String fileName;
private long totalSize;
private long received;
private boolean finished = false;
private long x = 0, compare = 0;
private double progress;


public FileReceiver(int port, String saveTo) throws IOException {
this.port = port;
this.saveTo = saveTo;
Path path = Paths.get(saveTo);
if (Files.notExists(path)) {
Files.createDirectories(path);
}
}


@Override
public void run() {
try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
serverSocketChannel.bind(new InetSocketAddress(port));
if (receiveAttributes(serverSocketChannel)) {
receiveFile(serverSocketChannel);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
finished = true;
}
}


private boolean receiveAttributes(ServerSocketChannel serverSocketChannel) throws IOException {
try (SocketChannel accept = serverSocketChannel.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(Channels.newInputStream(accept)) )) {
String s = reader.readLine();
String[] split = s.split(";");
fileName = split[0];
totalSize = Long.parseLong(split[1]);
return true;
}
}


private void receiveFile(ServerSocketChannel serverSocketChannel) throws IOException {
try (SocketChannel accept = serverSocketChannel.accept();
FileOutputStream fileOutputStream = new FileOutputStream(saveTo + File.separator + fileName);
FileChannel fileChannel = fileOutputStream.getChannel()) {
long read;
long buffer = 1024 * 64;
calculator();
while (received < totalSize) {
if (totalSize - received < buffer) {
buffer = (int) (totalSize - received);
if (buffer <= 0) {
buffer = (int) totalSize;
}
}
read = fileChannel.transferFrom(accept, received, buffer);
if (read > 0) {
received += read;
} else {
break;
}
}
}
}


private void calculator() {
Timer timer = new Timer(t, e -> {
x = received - compare;
compare = received;
progress = (received * 100 / totalSize);
System.out.println("Receiving -> "
+ MyUtil.roundFileSize(received) + " / " + MyUtil.roundFileSize(totalSize)
+ " --- " + MyUtil.calculateRate(x, t)
+ " --- " + ((int) progress) + " %");
if (finished) {
if (received == totalSize) {
System.out.println("Successfully received!");
} else {
System.out.println("Download was unsuccessful!");
}
((Timer) e.getSource()).stop();
}
});
timer.setCoalesce(true);
timer.setRepeats(true);
timer.start();
}


}


FileSender :


import javax.swing.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;


/**
* @author avb
*/
public class FileSender implements Runnable {


private final File file;
private final long totalSize;
private final InetSocketAddress address;
private final int t = 500;
private long sent;
private boolean finished = false;
private long x = 0, compare = 0;
private double progress;


public FileSender(File file, String ip, int port) {
this.file = file;
totalSize = file.length();
address = new InetSocketAddress(ip, port);
}


@Override
public void run() {
try {
if (sendAttributes()) {
Thread.sleep(100);
sendFile();
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
finished = true;
}
}


private boolean sendAttributes() throws IOException {
try (SocketChannel socketChannel = SocketChannel.open()) {
if (socketChannel.connect(address)) {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(Channels.newOutputStream(socket Channel)))) {
writer.write(file.getName() + ";" + totalSize);
}
return true;
} else {
System.out.println("Cannot connect to " + address.getHostName() + ":" + address.getPort());
return false;
}
}
}


private void sendFile() throws IOException {
try (SocketChannel socketChannel = SocketChannel.open()) {
if (socketChannel.connect(address)) {
try (FileInputStream fileInputStream = new FileInputStream(file.getAbsolutePath());
FileChannel fileChannel = fileInputStream.getChannel()) {
long read;
long buffer = 1024 * 64;
calculator();
while (sent < totalSize) {
if (totalSize - sent < buffer) {
buffer = (int) (totalSize - sent);
if (buffer <= 0) {
buffer = (int) totalSize;
}
}
read = fileChannel.transferTo(sent, buffer, socketChannel);
if (read > 0) {
sent += read;
} else {
break;
}
}
}
} else {
System.out.println("Cannot connect to " + address.getHostName() + ":" + address.getPort());
}
}
}


private void calculator() {
Timer timer = new Timer(t, e -> {
x = sent - compare;
compare = sent;
progress = (sent * 100 / totalSize);
System.out.println("Sending -> "
+ MyUtil.roundFileSize(sent) + " / " + MyUtil.roundFileSize(totalSize)
+ " --- " + MyUtil.calculateRate(x, t)
+ " --- " + ((int) progress) + " %");
if (finished) {
if (sent == totalSize) {
System.out.println("Successfully sent!");
} else {
System.out.println("Failed to send file!");
}
((Timer) e.getSource()).stop();
}
});
timer.setCoalesce(true);
timer.setRepeats(true);
timer.start();
}


}


MyUtil :


public class MyUtil {


public static String roundFileSize(double bytes) {
StringBuilder sb = new StringBuilder();
if (bytes > 1024) {
double kiloBytes = (bytes / 1024);
if (kiloBytes > 1024) {
double megaBytes = (kiloBytes / 1024);
if (megaBytes > 1024) {
double gigaBytes = (megaBytes / 1024);
sb.append(twoTenthDigit(gigaBytes)).append(" GB");
} else {
sb.append(twoTenthDigit(megaBytes)).append(" MB");
}
} else {
sb.append(twoTenthDigit(kiloBytes)).append(" KB");
}
} else {
sb.append(twoTenthDigit(bytes)).append(" Bytes");
}
return String.valueOf(sb);
}


public static String calculateRate(double bytes, long millis) {
double bytes_per_sec = (bytes * 1000) / millis;
return roundFileSize(bytes_per_sec) + "/Sec";
}


private static float twoTenthDigit(double a) {
return (float) (Math.round(a * 100.0) / 100.0);
}


}


برای تست :

Send :


import java.io.File;
import java.io.IOException;


/**
* @author avb
*/
public class Send {


public static void main(String[] args) throws IOException {
File file = new File("1.mp4");
FileSender sender = new FileSender(file, "192.168.1.36", 10100);
new Thread(sender).start();
}


}


Receive :


import java.io.IOException;


/**
* @author avb
*/
public class Receive {


public static void main(String[] args) throws IOException {
FileReceiver receiver = new FileReceiver(10100, "downloads folder");
new Thread(receiver).start();
}


}


خروجی :


Sending -> 136.0 MB / 439.15 MB --- 272.0 MB/Sec --- 30 %
Sending -> 274.5 MB / 439.15 MB --- 277.0 MB/Sec --- 62 %
Sending -> 416.5 MB / 439.15 MB --- 284.0 MB/Sec --- 94 %
Sending -> 439.15 MB / 439.15 MB --- 45.3 MB/Sec --- 100 %
Successfully sent!



Receiving -> 142.94 MB / 439.15 MB --- 285.88 MB/Sec --- 32 %
Receiving -> 281.13 MB / 439.15 MB --- 276.38 MB/Sec --- 64 %
Receiving -> 423.5 MB / 439.15 MB --- 284.75 MB/Sec --- 96 %
Receiving -> 439.15 MB / 439.15 MB --- 31.3 MB/Sec --- 100 %
Successfully received!

badname
جمعه 23 آبان 1393, 12:26 عصر
ahmad.mo74 (http://barnamenevis.org/member.php?337969-ahmad-mo74) عزیز سلام
مثال قشنگی زدی خیلی خوبه ولی نتونستم ازش استفاده کنم ، چجوری باید کامپایلش کرد لطفا راهنمایی کنید.
ورودی و خروجی فایل هم پیدا نکردم ( یعنی آدرس فایل معلوم نیست از کجا import میشه تو sender به کجای reciver ذخیره میشه )

ahmad.mo74
سه شنبه 27 آبان 1393, 08:42 صبح
سلام، ببخشید ندیدم این پست رو...

همه چیز واضحه یعنی خیلی راحت میتونی این رو به ui ات وصل کنی، کاربر اول یک فایلی رو انتخاب میکنه و شما اون رو به همراه ip و port مقصد میدی به کلاس Sender ای new کردی و از اون طرف هم Receiver باید ران شده باشه تا هر وقت فایل رسید تو محلی که بهش گفتی ذخیرش کنه یا اینکه توی یک محل مشخص از گوشی ذخیره بشه مثلا فولدر downloads...

ui ات باید طوری باشه که این پارامتر هارو از کاربر بگیری، بازم سوالی بود در خدمتم :)

badname
چهارشنبه 28 آبان 1393, 23:37 عصر
سلام ممنون از راهنماییت ، واقعا کمک کرد بهم ! (خیلی وقته دارم تحقیق میکنم در این درباره ، این بهترین چیزیه که دیدم )
inputstream و خروجی رو تو رسیور ردیف کردم ، آی پی و اینام که فعلا برا تست دستی ست کردم.

ولی یجاهایی مشکل داره کد فکر کنم وقتی داشتی اینجا قرار میدادی اینجوری شده احتمالا ، بعضی جاهاش بهم ریخته بود تا حدودی درست کردم ولی یسری جاهاش خطا میده .سوروس گیت هاب یا فایل پروژه رو داری بزاری ؟ هر کاری کردم درست نشد بعضی جاهاش ش ....
مثلا اینو آشنایی ندارم باهاش چه تابعی هست ؟
private void calculator() {
Timer timer = new Timer(t, e -> {
x = sent - compare;
compare = sent;

شاید هم من اشتباه میکنم ، نیاز به لایبری خاصی نداره ؟
ممنون:لبخندساده: