Avatar billede Godfather75 Nybegynder
07. oktober 2012 - 16:27 Der er 8 kommentarer og
1 løsning

Binary data til Server

Hej Jeg har et lille problem:
Jeg skal lave en kommunikation til serve med en klient der skal sende binary data. Serveren skal så sende retur med en text"String".

Er det muligt at bruge DataOutputStream til at sende til Serveren? Er det ikke binært?
Jeg har forsøgt.. Men får en fejl:
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.DataInputStream.readInt(Unknown Source)
    at DateServer.main(DateServer.java:42)

Her er min Klient:
public class DateClient {

    /**
    * @param args
    */
    @SuppressWarnings("null")
    public static void main(String[] args) {

        boolean done = false;

        Scanner in = null;
        DataOutputStream dataOut = null;
        InputStream inStream = null;
        OutputStream outStream = null;
        Socket s = null;

        try {
            s = new Socket("127.0.0.1", 8199);
            s.setSoTimeout(10000);

            inStream = s.getInputStream();
            outStream = s.getOutputStream();
           

           

            in = new Scanner(inStream);

            Scanner text = new Scanner(System.in);
           
            new DataOutputStream(outStream);
           
            String serverOutput = in.nextLine();
            System.out.println("Connection received from "
                    + s.getInetAddress().getHostName());
            System.out.println("echo: " + serverOutput);

            while (!done) {
                String input = text.nextLine();
                int convertString = Integer.parseInt(input);
                System.out.println(convertString);
                dataOut.writeInt(convertString);
//                out.println(input);
                dataOut.flush();

                serverOutput = in.nextLine();

                System.out.println("echo: " + serverOutput);

    //            if (input.equals("BYE")) {
    //                done = true;
            //    }
            }

            s.close();
            dataOut.close();
            inStream.close();
            outStream.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Her er min Server:
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class DateServer {

    /**
    * @param args
    */
    public static void main(String[] args) {
        try
          { 
            // establish server socket
            ServerSocket s = new ServerSocket(8199);

            // wait for client connection
            System.out.println("Waiting for connection");     
            Socket incoming = s.accept( );
           
            try
            {
                InputStream inStream = incoming.getInputStream();
                OutputStream outStream = incoming.getOutputStream();
                DataInputStream dataIn = new DataInputStream(inStream);
                System.out.println(dataIn);
                //Scanner in = new Scanner(inStream);       
                PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
             
                out.println( "Hello! Enter BYE to exit." );
               
                // echo client input
                boolean done = false;
                while (!done)
                {
                    int x= dataIn.readInt();
// Jeg får en fejl her???
                   
                    String line ="1";
                    if (x==1){
                             
                  out.println("Echo: " + line);}
                   
             
             
              }
            }
            finally
            {
                incoming.close();
               
            }
          }
          catch (IOException e)
          { 
            e.printStackTrace();
          }
      }
}
Avatar billede arne_v Ekspert
07. oktober 2012 - 16:39 #1
Jeg faar ikke den fejl.

Har du en firewall som blokerer?
Avatar billede arne_v Ekspert
07. oktober 2012 - 16:40 #2
Ah - jeg fik fejlen efter at have indtastet et tal.
Avatar billede arne_v Ekspert
07. oktober 2012 - 16:42 #3
Jeg gaetter paa at:

new DataOutputStream(outStream);

skal vaere:

dataOut = new DataOutputStream(outStream);

:-)
Avatar billede arne_v Ekspert
07. oktober 2012 - 16:43 #4
Generelt tror jeg at baade client og server kode kan forsimples lidt.

Og hvis du alligevel sender mest tekst kan jeg ikke se nogen grund til at sende tal binaert.
Avatar billede Godfather75 Nybegynder
07. oktober 2012 - 19:33 #5
Hov det var da osse en dum fejl. Som du siger skal der står
DataOutputStream dataOut = new DataOutputStream(outStream);

Nu virker det;-)

Men nu til et spørgsmål: Er det forkert at bruge to forskellige pipelines?.
Som man kan se i min kode så bruger jeg en dataOutputStream til at sende primitive data types(binary values) fra klienten til Serveren.
Fra server siden bruger jeg PrintWriter (Prints formatted representations of objects to a text-output stream.)

Og et spørgsmål mere;-) ville objectOutputStream være en bedre løsning for DataOutputStream? Hvad er forskellen?
Avatar billede arne_v Ekspert
07. oktober 2012 - 20:16 #6
Det kan give store problemer at bruge forskellige niveauer af IO paa samme grundliggende stream p.g.a. diverse buffering

jeg vil klart anbefale et enkelt niveau

DataInputStream/DataOutputStream er gode hvis man skal sende store maengder (millioner) af int eller double, men det er ret sjaeldent et godt valg.

ObjectInputStream/ObjectOutputStream tillader dig at sende instanser af dine egne klasser og er et godt valg i nogle tilfaelde.

Men text og PrintWriter/BufferedReader er paa mange maader det simple valg.
Avatar billede arne_v Ekspert
07. oktober 2012 - 20:17 #7
http://www.eksperten.dk/spm/969695

et er eksempel paa buffer problemer p.g.a. multi level IO
Avatar billede Godfather75 Nybegynder
19. oktober 2012 - 20:14 #8
send et svar til pointgivning:-)
Avatar billede arne_v Ekspert
20. oktober 2012 - 17:22 #9
svar
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