Socket

Diskussion i 'Frågor, support och diskussion' startad av Ubi, 2 mar 2010.

  1. Ubi

    Ubi Baby Droid Medlem

    Blev medlem:
    1 mar 2010
    Inlägg:
    20
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej!

    Har skapat en server i C++ som ska ta emot nya anslutningar från telefonen och hantera data från dessa. Har dock fått problem med java sockets.

    Min kod:
    Kod:
    public void connect()
        {
            Socket soc;
            DataInputStream in;
            DataOutputStream out;
            try {
                soc = new Socket("123.123.123.123", 2000); //Självklart byter jag ut 123.123.123.123 mot min egen ip
                in = new DataInputStream( soc.getInputStream());
                out =new DataOutputStream( soc.getOutputStream()); 
    
            } catch (UnknownHostException e) {
                        TextView pos = new TextView(this);
                        pos.setText("UNKNOWN HOST");
    
                        setContentView(pos);
    
            } [B]catch (IOException e) {
                        TextView pos = new TextView(this);
                        pos.setText("Couldn't get I/O for the connection ");
    
                        setContentView(pos);
            }[/B]
        }
    
    problemet är att den får IOException hela tiden och kör den fetmarkerade koden.

    Vad har jag gjort fel?

    Kan tillägga att jag är nästan helt ny inom java och har tidigare bara använt C++.

    Har sökt men hittar inget som jag förstår så om någon skulle vilja förklara så är jag väldigt tacksam! :)

    Tack på förhand! :)
    Ubi
     
  2. juanez

    juanez Teen Droid Medlem

    Blev medlem:
    17 dec 2009
    Inlägg:
    327
    Mottagna gillanden:
    2

    MINA ENHETER

    Jag antar att ditt "eget ip" är c++ serverns.

    Kör du detta i android, eller är det ett testcase i java?

    För android måste du dels ge "permission internet"
    <uses-permission android:name="android.permission.INTERNET" />

    Sedan måste du självklart se till att du faktiskt är uppkoppplad mot WiFi't.

    Kodsnutten du postat ser vid en kort anblick korrekt ut.

    Vet inte om DataInputStream / DataOutPutStram är det du vill använda (fast det varierar ju med vad du vill göra.. ;) )

    skulle föreslå att göra något liknande istället:

    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    eller en bufferedwriter...

    edit: att inkludera ditt stacktrace är aldrig fel det heller... :)
     
  3. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Skulle som sagt vara bra att veta vad det är för exception du får. Det finns flera subklasser till IOException, och getMessage() kan även säga något vettigt.

    Vad gäller PrintWriter så skulle jag undvika den klassen iom att den inte kastar exceptions, och man därför varje gång bör kolla checkError(), och om man märker att man fått ett fel så kan man inte få reda på vad felet var.

    Kaj
     
  4. Ubi

    Ubi Baby Droid Medlem

    Blev medlem:
    1 mar 2010
    Inlägg:
    20
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack för all hjälp!

    Nu går det inte att skicka men är ansluten till servern. Kan dock vara fel på servern men ni får gärna kolla igenom koden om den ser bra ut i alla fall. :)

    Kod:
    public void write(String text)
        {
                out.write(text);
                if(out.checkError())
                    printScreen("ERROR!");
        }
        public void connect()
        {
            try {
                soc = new Socket("XX.XX.XX.XX", 2000);
                out = new PrintWriter(soc.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
    
            } catch (UnknownHostException e) {
                        TextView pos = new TextView(this);
                        pos.setText("UNKNOWN HOST");
    
                        setContentView(pos);
    
            } catch (IOException e) {
                        TextView pos = new TextView(this);
                        pos.setText("Couldn't get I/O for the connection to: ");
    
    
                        setContentView(pos);
            }
        }
    
    Tack på förhand!
    Ubi
     
  5. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Att det inte går att skicka är inte den bästa felbeskrivningen :)

    Vad försöker du skicka. Vad händer? Btw Varför använder du en BufferedReader, men en PrintWriter. Oftast använder man BufferedWriter om man använder BufferedReader.
     
  6. Ubi

    Ubi Baby Droid Medlem

    Blev medlem:
    1 mar 2010
    Inlägg:
    20
    Mottagna gillanden:
    0

    MINA ENHETER

    Fungerar att skicka nu, felet låg i servern. :P
    Behöver aldrig ta emot data från servern så ska ta bort BuffredReader helt.
    Vilken är bäst, BuffredWriter eller PrintWriter?
     
  7. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 jun 2009
    Inlägg:
    1 768
    Mottagna gillanden:
    44

    MINA ENHETER

    Jag skulle säga BufferedWriter (och ev anropa flush efter du skrivit data om det är så att du inte skriver så mycket data). En BufferedWriter döljer inte fel, och om något går fel så får man reda på vad som är fel.