2009-07-10 62 views
9

Tôi cần một ứng dụng đơn giản, tốt nhất là một nền tảng đa nền tảng, cho phép gửi các tệp giữa hai máy tính.Làm thế nào để chuyển các tệp từ máy tính này sang máy tính khác qua mạng bằng Java?

Nó chỉ cần chấp nhận và gửi tệp và hiển thị thanh tiến trình. Tôi có thể sử dụng những ứng dụng nào hoặc tôi có thể viết một ứng dụng như thế nào?

+0

Bạn đang đẩy hoặc kéo tệp? Tải lên hoặc tải xuống? –

Trả lời

4

gửi và nhận tập

Việc gửi và nhận của một tập tin cơ bản bị phá vỡ để hai miếng mã đơn giản.

đang recieving:

ServerSocket serverSoc = new ServerSocket(LISTENING_PORT); 

Socket connection = serverSoc.accept(); 

// code to read from connection.getInputStream(); 

đang gửi:

File fileToSend; 
InputStream fileStream = new BufferedInputStream(fileToSend); 

Socket connection = new Socket(CONNECTION_ADDRESS, LISTENING_PORT); 
OutputStream out = connection.getOutputStream(); 

// my method to move data from the file inputstream to the output stream of the socket 
copyStream(fileStream, out); 

Miếng gửi mã sẽ được chạy trên máy tính đang gửi mã khi họ muốn gửi một tập tin.

Mã nhận cần phải được đặt bên trong một vòng lặp, để mỗi khi ai đó muốn kết nối với máy chủ, máy chủ có thể xử lý yêu cầu và sau đó quay lại chờ trên serverSoc.accept().

Để cho phép gửi tệp giữa hai máy tính, mỗi máy tính sẽ cần chạy máy chủ (mã nhận) để nghe các tệp đến và cả hai đều cần phải chạy mã gửi khi họ muốn gửi tệp.

Progress Bar

Các JProgressBar trong Swing là đủ dễ sử dụng.Tuy nhiên, làm cho nó hoạt động đúng và cho thấy tiến độ hiện tại của việc chuyển tập tin là hơi khó khăn hơn.

Để có thanh tiến trình hiển thị trên biểu mẫu chỉ cần thả thanh đó vào một số JFrame và có thể đặt setIndeterminate(false) để mũ cho thấy chương trình của bạn đang hoạt động.

Để triển khai thanh tiến trình một cách chính xác, bạn sẽ cần phải tạo triển khai của riêng mình là SwingWorker. Các hướng dẫn Java có một ví dụ tốt về điều này trong lesson in concurrency của chúng.

Đây là một vấn đề khá khó khăn. Tôi muốn khuyên bạn nên hỏi điều này trong câu hỏi riêng của nó nếu bạn cần thêm trợ giúp với nó.

+0

@jjinguy chúng tôi nên đặt địa chỉ IP nào cho CONNECTION_ADDRESS nếu các máy tính không có trong mạng LAN? Ví dụ, địa chỉ IP bên ngoài của tôi là 1.2.3.4 nhưng nếu bạn đặt 1.2.3.4 là CONNECTION_ADDRESS, router sẽ biết máy tính nào (trong mạng gia đình của tôi) để chuyển tiếp gói tới? – Pacerier

+0

@Pacerier Bộ định tuyến của bạn sẽ xử lý bản dịch địa chỉ cho bạn. – jjnguy

+0

@jjinguy, vâng nhưng làm thế nào người gửi phải biết * cổng * nào để gửi gói tin sao cho nó được định tuyến chính xác? nhiều hơn trên http://superuser.com/questions/483033/how-does-peer-to-peer-work-over-the-internet – Pacerier

1

Bạn có thể viết một bằng cách sử dụng lập trình Socket trong Java. Bạn sẽ cần phải viết một máy chủ và một chương trình khách hàng. Máy chủ sẽ sử dụng một ServerSocket để lắng nghe các kết nối và Client sẽ sử dụng một Socket để kết nối với máy chủ đó trên cổng được chỉ định.

Dưới đây là một hướng dẫn: http://www.javaworld.com/jw-12-1996/jw-12-sockets.html

+0

Tại sao tái tạo lại bánh xe? –

+0

Tại sao không? Nó khá nhanh để làm, và nó sẽ có trong Java. – AlbertoPL

+0

Tôi đã làm điều đó! – jjnguy

0

Check-out this hướng dẫn, đó là một ví dụ thực sự cơ bản. Có thể bạn cũng muốn gửi tiêu đề điều khiển trước khi tệp thực được gửi, chứa kích thước tệp, tên tệp, v.v.

Hoặc, dựa trên giao thức hiện có, như dự án this.

+0

Cảm ơn đó là những gì tôi đang tìm kiếm. –

3

Tôi thực sự cân nhắc việc sử dụng FTP. Apache có FTP clientserver

Chỉnh sửa: đề xuất của HTTP của spdenne cũng tốt, đặc biệt nếu mọi người có Java 6. Nếu không, bạn có thể sử dụng một cái gì đó như Tiny Java Web Server.

+0

vâng tôi có thể .. nhưng tôi muốn một cái gì đó đơn giản nhất có thể để người mới bắt đầu không cần phải cài đặt bất cứ điều gì ... ngoài việc cài đặt Java mà tôi nghĩ rằng hầu hết mọi người đã có. –

+2

Bạn chắc chắn sẽ cần mã trên và trên JRE. Câu hỏi duy nhất là liệu bạn đang tự viết mã đó hay sử dụng các thư viện hiện có. Nếu bạn tự viết nó, nó có thể sẽ không chuẩn và bạn sẽ phải tự duy trì nó. –

0

Bạn có thể cài đặt máy chủ FTP trên (một trong số) máy của bạn không?

Nếu có thể, bạn sẽ chỉ phải sử dụng ứng dụng khách FTP (ví dụ FileZilla có thanh tiến trình).

1

Java 6 của Sun bao gồm trọng lượng nhẹ HTTP server API và triển khai. Bạn có thể dễ dàng sử dụng điều này để phục vụ tệp của bạn, sử dụng URLConnection để lấy nó.

0

Hai ứng dụng phổ biến là "scp" và "rsync". Đây là những tiêu chuẩn trên Linux, thường có sẵn trên Unix và có thể chạy trên Windows dưới Cygwin, mặc dù bạn có thể tìm thấy các ứng dụng gốc Windows có thể làm điều đó là tốt. (PuTTY có thể phục vụ như một khách hàng SCP).

Đối với bất kỳ loại chuyển tập tin pc-to-pc nào, bạn cần có trình nghe trên máy tính đích. Đây có thể là một ứng dụng daemon (hoặc hệ thống Windows), hoặc nó có thể là "siêu máy chủ" kiểu Unix được cấu hình để tải và chạy ứng dụng sao chép tệp thực tế khi ai đó liên lạc với cổng nghe.

SCP và một trong các chế độ rsync yêu cầu có một số loại khả năng đăng nhập từ xa. Rsync cũng có thể xuất bản tài nguyên mà nó sẽ xử lý thư mục. Vì khái niệm "đăng nhập từ xa" của Windows không được thiết lập tốt vì nó nằm trong Linux, điều này có thể thích hợp hơn. Thêm vào đó nó giới hạn truy cập từ xa vào các nguồn/đích đã xác định trên máy đích thay vì cho phép truy cập vào bất kỳ phần nào (được ủy quyền) của hệ thống tập tin.

0

Để chuyển qua mạng hiệu quả hơn. Hãy xem this article giải thích việc truyền dữ liệu hiệu quả qua bản sao số

Các vấn đề liên quan