tommer> Det er vidst noget med man ikke kan de i Java, da det strider imod reglerne... -altså man kan ikke gemme .gif filer,-ved egentlig ik' om man kan åbne dem... (kun noget jeg har hørt!)
det kan man godt... jeg kan læse filen men når jeg laver en ny kommer der en fil som der skal, men den er bare tom. jeg gør sådan her: BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); DataOutputStream tofile = new DataOutputStream(new FileOutputStream("test.gif")); String line = inFromServer.readLine(); while (line !=null){ tofile.writeBytes(inFromServer.readLine()); line = inFromServer.readLine(); }
Men den kunne dog blive pænere ved ikke at bruge hardcodede værdier og stort begyndelses bogstav i klasse navnet..*rødme* sorry... og desuden ikke fange Exception men derimod IOException men hvad kan jeg sige, det skulle gå hurtigt... :)
Yep, og der er ingen grundt til at kalde .flush() hvis du kalder .close() bagefter, og din buffer størrelse skulle du nok lave som en
static final int istedet for en int.
Og din måde at sætte {}'ere er frygtelig grim, synes jeg, jeg forstår ganske enkelt ikke SUN har valgt den som deres forslag til codeconvention, men jeg ved fra venner hos SUN, at de ikke engang selv er konsekventer imens de udvikler :)
Nå ja og så gemmer man det selvfølgelig i en metode istedet for i main() metoden :)
Jeg mener dog at mine {} er sat rigtigt (og pænt). Men det er nu mere en smagssag! :)
Jeg vil iøvrigt gå med til at den KAN være final hvis jeg ikke vil kunne ændre den inden for metoden, men static kan den ikke være når den står i en main metode, så skal den flyttes op (uden for metoden).
Jeg synes nu heller ikke dette lille eksempel fortjener en metode for sig, men det må være op til hver enkelt at bedømme! :)
>caspermadsen jeg får filen fra en server via BufferedReader, hvordan putter jeg det over i : FileInputStream fis = new FileInputStream("c:\\some.gif"); ???
byt FileInputStream fis = new FileInputStream("c:\\some.gif");
ud med BufferedReader fis = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
så virker det.
casper: Ja den med {} blvier vi aldrig enige om, jeg synes de skal stå over hinanden så man kan se hvilke der hører sammen, som netop gør det overskueligt :)
Med de skærm opløsninger man kører idag betyder det at spare en linie ingen ting.
Tilgengæld gør det at flytte den hen til enden at man ikke lægger mærke til den osv.
Men helt enig, vi bliver aldrig enige på dette punkt.
Men jeg hader folk der fjerner tomme linier for at spare plads, jeg foretrækker overskuelig og åben kode, fremfor folk der f.eks. har en while som denne her:
Hvad svarer jeg ikke på ? Du sendte noget kode ud som laver noget helt andet end det blev spurgt om. Og jeg påpegede det. Fordi det er mere relevant om koden løser opgaven end hvilken bracket style man bruger.
Hvis du styrer serveren, ville jeg istedet foreslå at du bruger byte's over hele linien, så undgår du nemlig tab med konvertering af chars, da der ingen grund er til det. Når du vælger en CharToByte....() klasse skal du nemlig vide om det er ASCII eller...? disse problemer vil du undgå hvis du bruger byte's istedet for chars.
arne: Taget fra InputStream's API om read(byte[]) metoden: public int read(byte[] b) throws IOExceptionReads up to b.length bytes of data from this input stream into an array of bytes. This method blocks until some input is available.
Så vidt jeg kan se, læser den som forventet om til b.length tegn altså op til 65536 som jeg nævnte.
Der står også det er 'BYTES' den læser !!, og om de så har værdier imellem -128 og 128 eller 0-255 betyder ikke det fjerneste da de bliver skrevet lige bagefter.
Forresten dit sidste eksempel er ikke særligt godt, det performer ca. så dårligt som det kan da du læser/skrive 1 byte af gangen, pak dem ind en Buffer først.
>caspermadsen.. jeg roder rundt i alle jeres forslag (hjææææælp) det jeg vil er at klienten sender navnet på filen den skal bruge til serveren. serveren skal hente filen og sende den tilbage til klienten. det jeg er kommet frem til ved jeg ikke om er rigtigt, her kommer min server så kan du måske kigge lidt på den ;-) : import java.io.*; import java.net.*;
class TCPServer { public static void main (String args[]) throws Exception { String clientSentence=null; ServerSocket welcomeSocket= new ServerSocket (6789);
while (true) { Socket connectionSocket = welcomeSocket.accept();
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); DataInputStream inFomClient = new DataInputStream(connectionSocket.getInputStream());
clientSentence = new Integer(inFomClient.read()).toString();
FileInputStream fis = new FileInputStream(clientSentence); int b; while(fis.available() > 0) { b = fis.read(); outToClient.write((byte)b); }//slut while
inFromClient.read() læser kun 1 tegn(byte), som du sender ind til en Integer (hel tal), og så henter du dit nye objekts reference (hel talets)ud med toString() og ligger det ind i clientSentence... Jeg er RET overbevist om at det ikke er det du vil! :D
Istedet skal du lave følgende (ikke testet): BufferedReader d = new BufferedReader(new InputStreamReader(new DataInputStream(System.in))); FileInputStream fis = new FileInputStream(new File(d.readLine()));
Resten ser for så vidt godt nok ud... :)
Men som sagt har jeg ikke testet, så du må lige selv prøve det...
class TCPServer { public static void main (String args[]) throws Exception { String clientSentence=null; ServerSocket welcomeSocket= new ServerSocket (6789);
while (true) { Socket connectionSocket = welcomeSocket.accept();
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); DataInputStream inFomClient = new DataInputStream(connectionSocket.getInputStream());
BufferedReader d = new BufferedReader(new InputStreamReader(inFomClient)); FileInputStream fis = new FileInputStream(new File(d.readLine()));
int b; while(fis.available() > 0) { b = fis.read(); outToClient.write((byte)b); }//slut while
Grunden til at der skal være BufferedReader alligevel er at du skal have filnavnet ud (og da det er karakterer så nytter det ikke rigtig at bruge byte's der).
Jeg håber ikke vi har forvirret dig mere end hvad godt er, men det er et besværligt område for nybegyndere, det kunne godt være du skulle prøve noget der er lidt lettere først. :)
casper: jeg prøver at lave en klient til det vi lige er kommet frem til med serveren. jeg er nok helt forkert på den igen :0 eller hvad ? den kommer her: import java.io.*; import java.net.*;
class TCPClient{
public static void main(String[] args)throws Exception{ String sentence; //String s; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence+'\n');
DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
DataOutputStream fos = new DataOutputStream(new FileOutputStream(sentence));
Hmmm... umiddelbart ser det faktisk fornuftigt ud synes jeg... Men generelt er jeg slet ikke sikker på du kan det du prøver på... lad mig forstå det rigtigt...
1.Brugeren indtaster en billede url. 2.Denne url sendes til serveren 3.Serveren returnerer en gif 4.Giffen gemmes på klienten.
Er det rigtig forstået?
Hvis det er, hvorfor så ikke bare fyre en url af mod en apache, og derved få billedet?? og så køre det over http. Ville det ikke være meget lettere, eller er der noget jeg har helt misforstået?
Du kan bare poste flere spørgsmål så tager vi dem som det kommer! :)
Synes godt om
Ny brugerNybegynder
Din løsning...
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.