Sending File Via Network

Posted on

Connectivity Everywhere
Connectivity Everywhere

Connectivity Everywhere! Sudah sering kita temui perangkat yang dapat digunakan untuk mengirimkan data antar satu perangkat dengan yang lain, baik itu menggunakan komputer  via LAN, handphone dengan teknologi bluetoothnya, kemampuan wireless yang tertanam pada notebook, bahkan yang paling baru smartphone yang memiliki akses NFC (Near Field Communication). Teknologi-teknologi tersebut memungkinkan kita dapat berbagi file dengan mudah tanpa terkendala jarak. Tapi, pernahkah terpikir bagaimana jalan kerjanya? Dan bagaimana membuatnya? Kali ini kita akan belajar bagaimana merancang aplikasi yang mampu mengirimkan file dari 1 komputer ke komputer yang lain, dengan akses network tentunya. Saya menggunakan Visual Studio 2012 sebagai IDEnya.

Aplikasi ini terdiri dari 2 bagian, yaitu sisi server dan sisi client. Sisi client berfungsi sebagai pengirim data, sedangkan sisi server berfungsi sebagai penerima data yang dikirim client. Server dapat menerima pengiriman data dari client lebih dari 1, tergantung dari setting yang diatur. Untuk melakukan proses pengiriman, pastikan sisi server telah di-running dengan IP dan port tertentu. Setelah itu, setting client agar melakukan request ke server dengan IP dan port yang telah dibuka. Pengiriman file dari client akan ditampung server untuk kemudian disimpan pada folder tertentu. Perlu diperhatikan, bahwa file yang dikirim tidak lebih dari batas maksimal ukuran. Setting pengaturan ukuran maksimal file dapat diubah pada sisi server.

Tampilan aplikasi pengiriman file yang akan kita bangun kira-kira seperti ini.

ScreenshotSendingFile

Langkah pertama adalah buat sebuah project Windows Form baru bernama ServerSendFile pada Visual Studio. Buat class bernama FTPServer.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ServerSendFile
{
    /// <summary>
    /// Class untuk transfer file menggunakan socket
    /// </summary>
    class FTPServer
    {
        IPEndPoint ipEnd;
        Socket sock;
        int port = 5110;    //default

        public FTPServer()
        {
            //Membuat sebuah IP End Point untuk menerima saluran dari berbagai IP dengan port 5110
            ipEnd = new IPEndPoint(IPAddress.Any, port);
            //Membuat objek socket baru dengan tipe protokol dan tipe data transfer
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            //Binding End POint yang sudah dibuat dengan socket
            sock.Bind(ipEnd);
            //port = _port;
        }

        public static string receivedPath;
        public static string curMsg = "Stopped";

        /// <summary>
        /// Starting Server
        /// </summary>
        public void StartServer()
        {
            try
            {
                curMsg = "Starting...";
                //Socket dapat menghandle client maksimal 100 koneksi dalam 1 waktu dan menunggu koneksi client baru
                sock.Listen(100);

                curMsg  =   "Running and waiting to receive file.";
                //Saat request dari client diterima dan mengembalikan objek socket baru untuk menghandle client
                Socket clientSock   =   sock.Accept();

                byte[] clientData = new byte[1024 * 5120];
                int receivedBytesLen = clientSock.Receive(clientData);
                curMsg = "Receiving data...";

                //Mengetahui panjang file
                int fileNameLen = BitConverter.ToInt32(clientData, 0);
                //MEmbaca nama file
                string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);

                //Membuat sebuah Binary Stream writer untuk menyimpan data yang diterima dari client
                BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + "/" + fileName, FileMode.Append));
                //Membaca data client dan menyimpannya menggunakan binary writer
                bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);

                curMsg = "Saving file...";
                bWrite.Close();
                //Menutup binary writer dan client socket
                clientSock.Close();

                curMsg = "Received & Saved file; Server Stopped.";
            }
            catch (Exception ex)
            {
            }
        }
    }
}

Setelah itu ubah desain sisi server sesuai yang ada di gambar. Komponen yang digunakan antara lain Label, TextBox, Button, FolderBrowserDialog, BackgroundWorker, dan Timer. Perlu diperhatikan bahwa untuk merespon pengecekan file yang diterima server menggunakan objek BackgroundWorker. Setelah sisi server selesai, langkah selanjutnya adalah membangun sisi client. Pada sisi client, buat project baru secara terpisah. Buat class baru bernama FTPClient.cs

//File FTPClient.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ClientSendFile
{
    /// <summary>
    /// Class untuk transfer file pada sisi client menggunakan socket
    /// </summary>
    class FTPClient
    {
        public static string curMsg = "Idle";
        public static void SendFile(string fileName)
        {
            try
            {
                //Membuat IP end point, disamakan dengan sisi server
                IPAddress[] ipAddress = Dns.GetHostAddresses("10.151.31.212");
                IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 5110);
                //Membuat sebuah socket client untuk mengirimkan data ke server
                Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                string filePath = "";

                fileName = fileName.Replace("\\", "/");
                while (fileName.IndexOf("/") > -1)
                {
                    filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
                    fileName = fileName.Substring(fileName.IndexOf("/") + 1);
                }

                byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
                if (fileNameByte.Length > 5120 * 1024)
                {
                    curMsg  =   "Ukuran file lebih dari 5Mb silahkan coba lagi dengan file berukuran lebih kecil";
                    return;
                }

                //Membaca dan menyimpan file byte data di dalam byte array
                curMsg = "Buffering";
                byte[] fileData = File.ReadAllBytes(filePath + fileName);
                //clientData akan menyimpan bytes secara lengkap pada nama file
                byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
                //file name length's binary data
                byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

                //copy bytes yang ada ke dalam format [file name length][file name][file content]
                fileNameLen.CopyTo(clientData, 0);
                fileNameByte.CopyTo(clientData, 4);
                fileData.CopyTo(clientData, 4 + fileNameByte.Length);

                //mencoba melakukan koneksi ke server
                curMsg = "Connection to server...";
                clientSock.Connect(ipEnd);

                //Mengirim data file
                curMsg = "File sending...";
                clientSock.Send(clientData);

                //Data berhasil dikirimkan dan koneksi ditutup
                curMsg = "Disconnecting...";
                clientSock.Close();
                curMsg = "File transfered";

            }
            catch (Exception ex)
            {
                if (ex.Message == "No connection could be made because the target machine actively refused it")
                    curMsg = "File Sending fail. Because server not running.";
                else
                    curMsg = "File Sending fail." + ex.Message;
            }
        }
    }
}

Project lengkap dapat didapatkan di sini, semoga bermanfaat 😀

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s