Pobieranie pliku z serwera

0

Witam

Próbuję pobrać plik mp3 w sieci dostępny pod tym adresem: http://wrzucacz.pl/file/4571387800201/the_beatles_-_free_as_a_bird_lyrics-ZYfiRvL-zUU_fmt43.mp3
z sieci i pobiera mi ale 12 KB choć plik ma ponad 5MB. Oto kod:

 
WebClient cos = new WebClient();
        cos.DownloadFile("http://wrzucacz.pl/file/4571387800201/the_beatles_-_free_as_a_bird_lyrics-ZYfiRvL-zUU_fmt43.mp3", "free.mp3");

Wie ktoś co na to poradzić?

Mam jeszcze inne pytanie: Czy podczas wymiany danych na localhost- serwerze, czyli "127.0.0.1" port 1024, można najpierw odpalić program który wrzuca coś na ten serwer, następnie wyłączyć program i potem włączyć program który odbiera to co wrzuciliśmy na tym serwerze? Czy wymiana danych możliwa jest tylko podczas włączonego programu?

Wiąże się to z tym pierwszym pytaniem, bo wcześniej chciałem aby program wrzucał coś na jakiś serwer, a następnie inny program będzie pobierać to coś z innego serwera- przy czym będą one pracowały nie w tym samym momencie, czyli najpierw program wrzucający, potem wyłączę i włączam program pobierający na dysk z serwera.

Będę wdzięczny za pmoc

0

powinieneś to pobrać: http://wrzucacz.pl/download/4571387800201

0

Ten link, który masz wstawiony do funkcji DownloadFile to link do strony, z której można dopiero pobrać twoją mp3'kę,a link do samego piku jest ukryty pod tym co napisał Ci już .AI.
Odnośnie drugiego pytania: Nie do końca rozumiem. O jaki serwer Ci chodzi?

0
sainser napisał(a):

Ten link, który masz wstawiony do funkcji DownloadFile to link do strony, z której można dopiero pobrać twoją mp3'kę,a link do samego piku jest ukryty pod tym co napisał Ci już .AI.
Odnośnie drugiego pytania: Nie do końca rozumiem. O jaki serwer Ci chodzi?

Hmm no chodzi o taki kod:

 
 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
 Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
Socket internalSocket;
            byte[] recBuffer = new byte[5500000];
            
            serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1024)); // przypisuje adres 
            //nasłuchiwania jako 127.0.0.1 na porcie 1024. Ten socket będzie pełnił funkcję serwera

            serverSocket.Listen(1); //ustawiamy stan serwera na nasłuchiwanie. Parametr to maksymalna ilość połączeń oczekujących
            clientSocket.Connect("127.0.0.1", 1024);
            

            byte[] kk = File.ReadAllBytes("muzyka.mp3");


           internalSocket = serverSocket.Accept();
            clientSocket.Send(k); 


            internalSocket.Receive(recBuffer);    //przesyłamy do recBuffera odebrane dane
            return recBuffer;   

I teraz tutaj jak widać wysyłamy coś do serwera a następnie z niego to odbieramy. Mnie interesuje, czy moglibyśmy oddzielnie napisać- najpierw wysyłanie, a potem odbieranie jako dwa oddzielne programy, przy czym najpierw uruchamiamy ten wysyłający, wyłączamy go, następnie uruchamiamy ten otwierający.

0

Program, który tutaj masz, jest serwerem (oraz klientem samego siebie). Aby móc do niego wysłać/odebrać dane serwer musi być stale włączony.

0
Ktos napisał(a):

Program, który tutaj masz, jest serwerem (oraz klientem samego siebie). Aby móc do niego wysłać/odebrać dane serwer musi być stale włączony.

Czyli chodzi o to, że te linijki kodu odpowiedzialne za nasłuchiwanie, oraz przypisanie adresu nasłuchiwania muszą być cały czas w kodzie- czyli po prostu to co pisałem wcześniej, że nie da się tego tak podzielić, że najpierw włączę nasłuchiwanie serwera i wyślę coś, wyłączę program, a następnie w drugim programie będzie TYLKO odbieranie danych z serwera?

0

No skoro wyłączysz serwer to nie będzie on mógł odbierać. Ale jeżeli uruchomisz drugi program, który będzie serwerem to będzie on nasłuchiwał (odbierał) znowu.

0
sainser napisał(a):

No skoro wyłączysz serwer to nie będzie on mógł odbierać. Ale jeżeli uruchomisz drugi program, który będzie serwerem to będzie on nasłuchiwał (odbierał) znowu.

Ale takie połączenie jakie jest ukazane w kodzie to jest połączenie chyba tylko lokalnie- w sieci lokalnej tak? Tzn taka wymiana danych zadziałałaby tylko między komputerami mającymi to samo IP zewnętrzne?
Prosiłbym o jakieś rozjaśnienie i czy da się łączyć i wymieniać informacje z jakimiś innymi IP, z komputerami korzystającymi z innych sieci lokalnych

0

To, co masz w tym kodzie, to ustawienie serwera, który nasłuchuje na 127.0.0.1. Do takiego serwera podłączysz się tylko z tego samego komputera.
Jeśli nasłuchujesz na IP "zewnętrznym" danego komputera, to oczywiście masz możliwość dostania się do tego serwera z innych komputerów na świecie. O ile nie jest po drodze coś zablokowane.

0
Ktos napisał(a):

To, co masz w tym kodzie, to ustawienie serwera, który nasłuchuje na 127.0.0.1. Do takiego serwera podłączysz się tylko z tego samego komputera.
Jeśli nasłuchujesz na IP "zewnętrznym" danego komputera, to oczywiście masz możliwość dostania się do tego serwera z innych komputerów na świecie. O ile nie jest po drodze coś zablokowane.

k to zrobic? jakich bibliotek, klas uzyc? Używając TcpClient i TcpListener jeśli podzielimy to na klient i serwer, gdzie w części Serwer użytkownik włącza nasłuchiwanie na swoim ZEWNĘTRZNYM IP (mówimy tu o połączeniu między użytkownikami nie tych samych sieci lokalnych), a w części Klient, np ja- łączę się z jego IP- i następuje wymiana informacji, to coś takiego się po prostu nie łączy. Mógłby ktoś podać jak zaimplementować taki komunikator dla dwóch użytkownik z innych sieci lokalnych?

Chcę od razu dodać, że brałem pod uwagę, że moży porty są zablokowane na nasłuch i odblokowywałem je tą metodą: http://support.microsoft.com/kb/308127/pl
Czyli krótko mówiąc interesuje mnie zrobienie komunikatora ale nie w sieci lokalnej, ale łączącego się z każdym po prostu

0

Jak najbardziej użyć klas TcpClient i TcpListener.
Chcesz, żeby twój serwer był dostępny na świat, tj. ludzie po twoim publicznym IP mogli się z nim połączyć. Co nie znaczy, że twój serwer ma nasłuchwiać na twoim publicznym IP. Ba, to jest niemożliwe. Mała znajomość podstaw działania sieci nie szkodzi. Otóż twój komputer jest w sieci lokalnej (powiedzmy 192.168.0.0). Gdy chce pogadać ze światem zewnętrznym to gada do swojego gateway'a, czyli twojego router'a (to będzie 192.168.0.1) i on przepuszcza tą wiadomość przez maskaradę i to sobie leci w świat. Jeżeli chcesz, żeby to działało w drugą stronę, tj. żeby świat zewnętrzny mógł gadać do twojego komputera, to na routerze musisz mieć ustawiony port forwarding. To działa tak, że jak na twój publiczny adres IP (czyli nota bene adres twojego router'a) na konkretny port (powiedzmy 1337) przyjdzie jakaś wiadomość to twój router prześle tą wiadomość do twojego komputera (powiedzmy 192.168.0.2).
Jak ustawić port forwarding to już ci wujek podpowie.
A tu masz przykładowy kod serwera:

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class ExampleServer
{
    static void Main(string[] args)
    {
        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.2"), 1337); //klient nasłuchuje w sieci lokalnej, jeżeli przyjdzie coś z zewnątrz to router to tutaj przepcha
        TcpListener listener = new TcpListener(ipEndPoint);
        listener.Start();
        TcpClient client = listener.AcceptTcpClient();
        NetworkStream stream = client.GetStream();
        BinaryWriter writer = new BinaryWriter(stream);
        BinaryReader reader = new BinaryReader(stream);
        Console.WriteLine(reader.ReadString());
        writer.Write("response");
        Console.ReadLine();
        client.Close();
        listener.Stop();
    }
}

I kod klienta:

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class ExampleClient
{
    static void Main(string[] args)
    {
        TcpClient client = new TcpClient("80.120.20.220", 1337); //klient nadaje na IP publiczne, czyli IP router'a
        NetworkStream stream = client.GetStream();
        BinaryWriter writer = new BinaryWriter(stream);
        BinaryReader reader = new BinaryReader(stream);
        writer.Write("test");
        Console.WriteLine(reader.ReadString());
        Console.ReadLine();
        client.Close();
    }
}
0
sainser napisał(a):

Jak najbardziej użyć klas TcpClient i TcpListener.
Chcesz, żeby twój serwer był dostępny na świat, tj. ludzie po twoim publicznym IP mogli się z nim połączyć. Co nie znaczy, że twój serwer ma nasłuchwiać na twoim publicznym IP. Ba, to jest niemożliwe. Mała znajomość podstaw działania sieci nie szkodzi. Otóż twój komputer jest w sieci lokalnej (powiedzmy 192.168.0.0). Gdy chce pogadać ze światem zewnętrznym to gada do swojego gateway'a, czyli twojego router'a (to będzie 192.168.0.1) i on przepuszcza tą wiadomość przez maskaradę i to sobie leci w świat. Jeżeli chcesz, żeby to działało w drugą stronę, tj. żeby świat zewnętrzny mógł gadać do twojego komputera, to na routerze musisz mieć ustawiony port forwarding. To działa tak, że jak na twój publiczny adres IP (czyli nota bene adres twojego router'a) na konkretny port (powiedzmy 1337) przyjdzie jakaś wiadomość to twój router prześle tą wiadomość do twojego komputera (powiedzmy 192.168.0.2).
Jak ustawić port forwarding to już ci wujek podpowie.
A tu masz przykładowy kod serwera:

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class ExampleServer
{
    static void Main(string[] args)
    {
        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.2"), 1337); //klient nasłuchuje w sieci lokalnej, jeżeli przyjdzie coś z zewnątrz to router to tutaj przepcha
        TcpListener listener = new TcpListener(ipEndPoint);
        listener.Start();
        TcpClient client = listener.AcceptTcpClient();
        NetworkStream stream = client.GetStream();
        BinaryWriter writer = new BinaryWriter(stream);
        BinaryReader reader = new BinaryReader(stream);
        Console.WriteLine(reader.ReadString());
        writer.Write("response");
        Console.ReadLine();
        client.Close();
        listener.Stop();
    }
}

I kod klienta:

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class ExampleClient
{
    static void Main(string[] args)
    {
        TcpClient client = new TcpClient("80.120.20.220", 1337); //klient nadaje na IP publiczne, czyli IP router'a
        NetworkStream stream = client.GetStream();
        BinaryWriter writer = new BinaryWriter(stream);
        BinaryReader reader = new BinaryReader(stream);
        writer.Write("test");
        Console.WriteLine(reader.ReadString());
        Console.ReadLine();
        client.Close();
    }
}

Hm, wielkie dzięki- a jeśli mam modem bezprzewodowy internet w PLUS LTE- to co z tym port forwarding?

0

Z internetem mobilnym może ci być ciężko.
Nie jestem na 100% pewien jak to działa, więc ci nie powiem ale zastanów się czy jest sens stawiać coś takiego na internecie mobilnym.
Możliwe, że to cię zainteresuje: http://internet.plus.pl/firmy/promocje/publiczny-adres-ip

1 użytkowników online, w tym zalogowanych: 0, gości: 1