25. februar 2003 - 11:28Der er
20 kommentarer og 1 løsning
Sende et worddocument
Heysa, Er der nogle der ved hvordan jeg sende en fil (fx. et worddoc) fra en javaserver til en javaklient? Jeg kan godt sende almindelig tekst som fx et .txt dokument men filer hvor der indgår 'computertegn' virker ikke efter overførslen...
Jeg prøver pt. med Reader/Writer's subklasser (16-bit):
BufferedReader fromFile = new BufferedReader((new FileReader(file))); PrintWriter recipient = new PrintWriter(socket.getOutputStream(),true);
Jeg har også prøvet med InputStream's subklasser (8-bit) men det virker heller ikke.
Jeg ville være glad for at se en lille kodestump :) Kasper
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Efter lang tids test er jeg kommet frem til noget underligt: Først ankommer filens sidste data og dernæst ankommer filens første data. Klient: void start(){ while(true){ try{ String in = reader.readLine(); if(in == null) continue;
if(in.equals("filetransfer:")){ File f = new File("c:/" , in=reader.readLine()); ChatWindow.getSingleton().addText("Recieve " +in); BufferedInputStream instr = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream outstr = new BufferedOutputStream(new FileOutputStream(f));
int n = 0; byte[] b = new byte[1000]; System.out.println("HER n="+n); while((n = instr.read(b)) >= 0){ System.out.println("In while n="+n); outstr.write(b, 0, n); outstr.flush(); if(n != 1000) break; } System.out.println("After while n="+n); //outstr.flush(); outstr.close(); ChatWindow.getSingleton().addText(f.getName() + " recieved"); } else ChatWindow.getSingleton().addText(in); } catch(IOException e){ System.out.println("IO 211 " + e); e.printStackTrace(); return; } } }
Server: int sendFile(){ int counter = dld.getCounter(); try{ fromFile = new BufferedInputStream(new FileInputStream(file)); toSocket = new BufferedOutputStream(recipient.getOutputStream()); recipient.writeln("filetransfer:"); recipient.writeln(file.getName());
//fromFile.skip(counter); int n; byte[] b = new byte[(int)file.length()];
Den outstr.flush() må være helt unødvendig. Data bliver flushet, når du closer filen. Og før kan du ike bruge den alligevel.
Men jeg forstår slet ikke den if break ! Den tror jeg kan lave mange ulykker, fordi selvom du har fået mindre end 1000 bytes, så kan der godt komme mere data (read returnerer -1 når der ikke er mere data og det fanger while løkken). Og de data må gå tabt.
Ok - mit problem er bare at dette program er en chatserver/klient (lidt som MIRC). Så til at håndtere brugerenes chatbeskeder benytter jeg BufferedReader. Er det unødvendigt? :=)
Hvis du har en helt fast protokol, således at client og server ikke er tvivl om, hvornår de læser en streng og hvornår de læser rå fil-data, så virker mine 2 meetoder perfekt.
open socket write kommando write filnavn write fil indhold close socket
open socket read kommando read filnavn read fil indhold close socket
er piece of cake.
Men hvis du vil veksle mellem kommandoer og fil indhold, så har du brug for at udvide protokollen lidt.
Så skal du også sende filens længde før filen. Ellers så ved modtageren ikke hvornår fil slutter og næste kommando starter.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.