Avatar billede warchowski Nybegynder
22. august 2001 - 11:57 Der er 5 kommentarer

client/server

Vi sidder her og prøver at få noget data (en fil) sendt fra client til server. Til dette anvender vi FileOutputStream/FileInputStream sammen med BufferedReader/-Writer.
Vi har socket connection, og er i stand til at kommunikere med f.eks. read-/writeUTF.


Sovsen følger her:

/****************\\
*  Fserver.java  *
\\****************/

import java.io.*;
import java.net.*;

public class Fserver
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket fserversocket = null;
        Socket fsocket = null;
        int sum = 0;
        String sumString = \"\";
       
        //create socket
        try
        {
            fserversocket = new ServerSocket(1337);
        }
       
        catch (Exception e)
        {
            System.err.println(\"Exception Creating Socket\");
        }
       
        while(true)
        {
            try
            {
                //wait for connection then create streams
                System.out.println(\"Waiting for socket connection\");
               
                fsocket = fserversocket.accept();
               
                //create streams
                DataOutputStream dosstream = new DataOutputStream(new BufferedOutputStream(fsocket.getOutputStream()));
                DataInputStream disstream = new DataInputStream(new BufferedInputStream(fsocket.getInputStream()));
               
                /* Problems with this section
                File testfile = new File(\"enfiljegharlavet.dat\");
                FileOutputStream fosstream = new FileOutputStream(testfile);
                BufferedOutputStream bos = new BufferedOutputStream(fosstream);
               
                bos.flush();
                bos.close();
                */
               
                //execute client requests
                while(true)
                {
                    String myOperation = disstream.readUTF();
                   
                    //perform increment function
                    if(myOperation.equals(\"increment\"))
                        sumString = String.valueOf(++sum);
                    //perform set sum operation
                    else
                        if(myOperation.equals(\"set_sum\"))
                        {
                            sum = 0;
                            sumString = String.valueOf(sum);
                            System.out.println(\"Sum = \" + sumString);
                        }
                    dosstream.writeUTF(sumString);
                    dosstream.flush();
                }
            }
           
            catch (Exception e)
            {
                System.err.println(\"Closing Socket Connection\");
                if(fsocket != null)
                   
                    try
                    {
                        fsocket.close();
                    }
                   
                    catch (IOException ex)
                    {}
            }
        }
    }
}


/****************\\
*  Fclient.java  *
\\****************/

import java.io.*;
import java.net.*;

public class Fclient
{
    public static void main(String[] args)
    {
        String sumString = \"\";
       
        try
        {
            if(args.length != 0)
            {
                System.out.println(\"Usage java Fclient <host> <count>\");
                return;
            }
           
            //create socket connection
            System.out.println(\"Opening socket and creating streams\");
            /* String host = args[0] */
            String host = \"localhost\";
            Socket socket = new Socket(host, 1337);
           
            //create streams
            DataOutputStream dosstream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
            DataInputStream disstream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
           
           
            String file = \"test2.dat\";
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);

            /* Problems with this section
            File testfile = new File(\"test2.dat\");
            FileInputStream fisstream = new FileInputStream(testfile);
            BufferedInputStream bis = new BufferedInputStream(fisstream);
            */
           
            //set sum to aero
            System.out.println(\"Setting sums to zero\");
            dosstream.writeUTF(\"set_sum\");
            dosstream.flush();
            sumString = disstream.readUTF();
           
            //get count, initialize start time
            System.out.println(\"INCREMENTING...PLZ STAND BY...\");
            // int count = new Integer(args[1]).intValue();
            int temp = 100;
            int count = temp;
            long startTime = System.currentTimeMillis();
           
            //perform increment \"count\" number of times
            for(int i = 0; i < count; i++)
            {
                dosstream.writeUTF(\"increment\");
                dosstream.flush();
                sumString = disstream.readUTF();
            }
           
            //display stat
            long stopTime = System.currentTimeMillis();
            System.out.println(\"Average ping = \" + ((stopTime - startTime)/(float)count) + \" msecs\");
            System.out.println(\"Sum = \" + sumString);
           
            /*
            bis.close();
            */
        }
       
        catch(Exception e)
        {
            System.err.println(e);
        }
    }
}

På forhånd tak :)
Avatar billede kresten Nybegynder
22. august 2001 - 11:59 #1

Nu har jeg ikke lige compilet det... men hvad er problemet?
Avatar billede warchowski Nybegynder
22. august 2001 - 12:12 #2
Sorry, den smuttede vist lige :/ Undskyld os et øjeblik, mens vi går ud og stikker kranierne i lokummet´.

Problemet ligger i, at vi ikke kan få sendt/modtaget f.eks. en fil vha. FileInput/-OutputStreams. Vi får simpelthen ikke filen overført :\\ Selv uden udkommenteringen af de to sektioner i Fserver/Fclient compiler det fint. Det var kun for at vise, hvor problemet måtte ligge.
Avatar billede logical Nybegynder
22. august 2001 - 12:47 #3
Nu er det lidt svært at læse af koden hvad i vil, men at sende en fil ned i en socket gøres således:

OutputStream os = new BufferedOutputStream(getSocketOutputStreamSomehow());
InputStream is = new FileInputStream(\"minfil\");
byte[] bytes = new byte[is.available()];  // Create an array large enough
is.read(bytes); // Read all bytes
os.write(bytes); // Write all bytes
os.flush();

At læse fra en socket til en fil gøres således:

InputStream is  = getSocketInputStreamSomehow();
OutputStream os = new BufferedOutputStream(new FileOutputStream(\"minfil\"));
for (int ch = is.read() ; ch != -1 ; is.read() )
  os.write(ch);  // Read and write each byte until EOF

Data(Input/Output)Stream bruges til at sende/modtage formatterede data (alt andet end bytes), og konverterer bare til bytes og kalder write metoden.

Avatar billede logical Nybegynder
22. august 2001 - 12:49 #4
Forresten,

metoden med available() virker kun hvis antallet ialt er kendt. Det er det hvis det er en FileInputStream (tilfælde 1) og ikke hvis det er en socket (tilfælde 2).

Derfor de to forskellige stumper kode.
Avatar billede logical Nybegynder
13. september 2001 - 07:43 #5
Hva, virker det?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester