Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Atapi
    senior tag

    Köszönöm, de sajnos így sem megy át semmi, viszont most a neten találtam egy másik módszert:

    Server:
    package serverkliens;


    import java.io.DataInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class FileServer extends Thread {

    private ServerSocket ss;

    public FileServer(int port) {
    try {
    ss = new ServerSocket(port);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void run() {
    while (true) {
    try {
    Socket clientSock = ss.accept();
    saveFile(clientSock);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    private void saveFile(Socket clientSock) throws IOException {
    DataInputStream dis = new DataInputStream(clientSock.getInputStream());
    FileOutputStream fos = new FileOutputStream("F:/zene.mp3");
    byte[] buffer = new byte[12 * 4096];

    int filesize = 15123; // Send file size in separate msg
    int read = 0;
    int totalRead = 0;
    int remaining = filesize;
    while((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) {
    totalRead += read;
    remaining -= read;
    System.out.println("read " + totalRead + " bytes.");
    fos.write(buffer, 0, read);
    }

    fos.close();
    dis.close();
    }

    public static void main(String[] args) {
    FileServer fs = new FileServer(1988);
    fs.start();
    }

    }

    Kliens:

    package serverkliens;

    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.Socket;

    public class FileClient {

    private Socket s;

    public FileClient(String host, int port, String file) {
    try {
    s = new Socket(host, port);
    sendFile(file);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    public void sendFile(String file) throws IOException {
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[12 * 4096];

    int read;
    while ((read = fis.read(buffer)) > 0) {
    dos.write(buffer, 0, read);
    }

    fis.close();
    dos.close();
    }

    public static void main(String[] args) {
    FileClient fc = new FileClient("localhost", 1988, "/Users/Valaki/Music/Zene/Aya Nakamura - Copines.mp3");
    }

    }

    Itt már jól működik a fájlátvitel mondjuk txt fájl esetén, viszont amint mp3-at adok meg neki akkor kb 15kb-ot átvisz és kapok egy ilyen üzenetet:
    java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)

    Ebben látsz valami hibát ? :) mi lehet a gondja? :R :R

    int filesize = 15123; --> ~15KB
    ebből számolod, hogy mennyit kell még fogadnod, ezért a szerver hamarabb megszakítja a fogadást, mint hogy a küldő a végére érne.

  • Atapi
    senior tag

    még egy dolog eszembe jutott.
    Ez a legjobb szerintem.
    do{
    valasz = beolvas.readLine();
    szamCimekClient.add(valasz);

    System.out.println(valasz);
    System.out.println(szamCimekClient.size());
    } while (valasz != null);

    Egyet értesz?

    Illetve az miért lehet hogy innen nem megy tovább a program? Mondjuk ha beírok egy kiíratást a ciklus után akkor azt nem írja már ki. :R

    én nem látom indokoltnak do-while használatát (akkor használod, ha valamit legalább egyszer szeretnél megcsinálni, de bizonyos feltétel esetén folytatod is. de te miért akarnál egyáltalán belépni a ciklusba, ha a beolvasásod null?).
    emellett a jelenlegi struktúrában a ciklus elején beolvasol, ami ha null érték, azt még megpróbálod feldolgozni, amit szerintem nem szeretnél (ez okozhatja is az újabb gondodat), de ebben tévedhetek.

  • Atapi
    senior tag

    köszönöm szépen

    így már jó gondolom:

    String valasz = beolvas.readLine();

    while (valasz != null) {
    valasz = beolvas.readLine();
    System.out.println(valasz);
    }

    így az első beolvasást nem fogod kiírni. (a változó frissítése a felhasználása után kellene, hogy történjen.) btw, csinálhatod így is:

    String valasz;
    while ((valasz = beolvas.readLine()) != null) {
    System.out.println(valasz);
    }

  • Atapi
    senior tag

    Server küldés:
    try {
    PrintWriter kuldes = new PrintWriter(beerkezoKliens.getOutputStream(), true);
    for (int i = 0; i < szamCimek.size(); i++) {
    kuldes.println(szamCimek.get(i));
    }
    } catch (IOException ex) {
    System.out.println("Nem kuldott semmit");
    }

    Kliens:

    BufferedReader beolvas = new BufferedReader(new InputStreamReader(s.getInputStream()));

    String valasz = beolvas.readLine();

    while (valasz != null) {
    System.out.println(valasz);
    }

    }

    mi lehet a gond?

    nem frissíted a valasz változó értékét a while cikluson belül. a beolvas.readLine() minden ismétlésnél le kéne, hogy fusson, de most csak egyszer fut le, amikor inicializálod vele a változót.

  • Atapi
    senior tag

    Azért kell példányosítani, mert a main metódus nem része az osztálynak.

    szvsz inkább azért kell példányosítani, mert nem csak osztályszintű metódusokhoz és változókhoz szeretne hozzáférni (prrint(), tandij). Példányváltozója pedig egy adott példánynak van (aka objektum állapot), illetve példány metódust is csak adott példányon lehet meghívni (aka objektum állapot változás, viselkedés). Ha csak az alapTandij értékéhez szeretne hozzáférni, akkor nincs szükség példányosításra, mivel az static (osztályszintű).
    a main helye ebből a szempontból szerintem irreleváns, jogosultsági kérdések esetén lenne jelentősége.

  • Atapi
    senior tag

    Sziasztok!
    A lenti kódban ezt a sort nem értem:
    String prevvalue=(String)newmap.put(3,"is great");

    Tudnátok segíteni az értelmezésében? köszönöm

    Ez: newmap.put(3,"is great") --> Beleteszi a 3. helyre az "is great" stringet. Ez eddig világos.
    De nem értem, hogy miért kell előtte (String) castolni és azt sem értem, hogy prevvalue értéke miért nem az újonnan berakott érték, azaz "is great" string lesz?

    Kódrészlet:
    public class HashMapDemo {
    public static void main(String args[]) {
    // create hash map
    HashMap newmap = new HashMap();

    // populate hash map
    newmap.put(1, "tutorials");
    newmap.put(2, "point");
    newmap.put(3, "is best");

    System.out.println("Map value before change: "+ newmap);

    // put new values at key 3
    String prevvalue=(String)newmap.put(3,"is great");

    // check returned previous value
    System.out.println("Returned previous value: "+ prevvalue);

    System.out.println("Map value after change: "+ newmap);
    }
    }

    Futási eredmény:
    Map value before change: {1=tutorials, 2=point, 3=is best}
    Returned previous value: is best
    Map value after change: {1=tutorials, 2=point, 3=is great}

    Innen vannak a fenti sorok.

    "Ez: newmap.put(3,"is great") --> Beleteszi a 3. helyre az "is great" stringet."

    lehet, hogy csak nem figyeltél a megfogalmazásra, de ez az állítás nem igaz. a map kulcs-érték párokat tárol, az elemeknek nincs rögzített helye (mint pl egy List esetén az x. elem), legalábbis a hashmap rendezetlen, így nincs garancia arra, hogy mi hova kerül, csak az garantált, hogy egy kulcshoz egy adott érték tartozik, és a kulcs alapján ezt az értéket kapod vissza. ez azt jelenti, hogy nem a 3. helyre helyezed a példában a sringet, hanem a 3 kulcshoz rendeled hozzá. a példa szerencsétlen abból a szempontból, hogy kiíratásnál a természetes sorrend érvényesül, azaz növekvő sorrendben kerülnek kiírásra a kulcs-elem párok, de ez nem mindig van így, nem lehet rá számítani. lehet, hogy most feleslegesen téptem a billentyűzetem és tudod ezeket, de a megfogalmazásod nem ezt sugallta.

  • Atapi
    senior tag

    Ja értem.

    Hát ez egy olyan alkalmazás lesz, ami PC-Desktopon és Androidon is működik. Egy kliens alkalmazás, ami JSON adatokat kap és azokat dolgozza fel. Ha a User szeretné, akkor el is mentheti és törölheti őket. Ennyi a fájlművelet.

    A folyamatos figyelést azért akarom a mappára beüzemelni, mert Mi van akkor, ha az alkalmazásban épp kilistázta a USER az elmentett fájlokat, azaz a mappa tartalmát és egy külön ablakban pl. TotalCommanderben kitöröl egy fájlt? Így ha olyan fájlt akar betölteni, ami nincs ott, akkor leállna.

    Ezzel kapcsolatban van tapasztalatotok?

    "ha olyan fájlt akar betölteni, ami nincs ott, akkor leállna"

    nem értem, hogy ez a rész sima kivételkezeléssel miért nem oldható fel. ha nem nyitható meg a megadott fájl, akkor hibaüzenet, frissítés, aztán az élet megy tovább. ráadásul a fájlkezelő (i/o) műveletek ha jól emlékszem eleve ellenőrzött kivételt dobnak, szóval amúgy is illene lekezelned az ilyen hibákat (pl attól, hogy ott van egy fájl, még nem biztos, hogy meg tudod nyitni, jogosultság, hw, vagy akármilyen hiba miatt. ilyenkor sem illik összeroskadnia a programnak).

  • Atapi
    senior tag

    Hi!

    Segítségeteket szeretnem kerni. Ismét egy rookie feladattal fárasztanálak benneteket :D. Osztálytömb lenne a téma, kicsit belezavarodtam.
    A lényeg röviden. Egy külön osztályban le kellett kepézni az éttermeket nevük, és kapacitásuk (tömbben asztalonként) szerint. Továbbá egy metódussal összesíteni az elérhető helyek számat, valamint egy másikkal stringbe rakni az eredményt.

    Nálam eddig ez így nézne ki:

    public class Restaurant{

    private int[] a;

    private String e;

    public Restaurant (String name, int[] seats){

    e = name;

    a = seats;

    }

    public int getTotalSeats (){

    int x = 0;

    for (int i = 0, i < a.length, i++){
    x = x + a[i];
    }

    return x;

    }

    public String toString (){

    String text;

    text = e + ": " + getTotalSeats() + " Places";

    return text;

    }


    }

    A követekéző lepésben a nyolcas sort metódusával összkapacitás alapján, csökkenő sorrendbe kéne őket rendezni.

    Ha minden passzolna, akkor a feladat által megadott főmetódus kidobna az eredményt.

    public class nyolcas{

    public static void sort (Restaurant[] restaurants){

    int max, w;

    for (int i = 0; i < restaurants.length - 1; i++){
    max = i;
    for (int j = i+1; j < restaurants.length; j++){
    if (restaurant[j].getTotalSeats() > restaurant[max].getTotalSeats())
    max = j;
    }
    w = restaurants[max];
    restaurants[max] = restaurants[i];
    restaurants[i]= w;
    }



    }

    public static void main(String[] args){

    Restaurant r1 = new Restaurant ("A", new int[] {4, 10, 5, 6, 4});

    Restaurant[] restaurants =
    { r1,
    new Restaurant ("B", new int[] {5, 3, 1}),
    new Restaurant ("C", new int[] {6, 4, 2}),
    new Restaurant ("D", new int[] {7, 5, 3})
    };

    sort (restaurants);

    for (Restaurant r: restaurants)
    System.out.println (r);
    }

    }

    Sajnos nem eszi meg, pls help.

    én három hibát találtam:
    - egy for ciklusban pontosvessző helyett sima vesszőt használtál
    - a restaurants tömbneved végéről több helyen lehagytad a záró s-t
    - w nem int tipusu, hanem Restaurant

Új hozzászólás Aktív témák

Hirdetés