Java och sockets

Diskussion i 'Frågor, support och diskussion' startad av Niklas, 30 jan 2011.

  1. Niklas

    Niklas Youth Droid Medlem

    Blev medlem:
    1 jun 2009
    Inlägg:
    110
    Mottagna gillanden:
    24
    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro

    MINA ENHETER

    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro
    Platta:
    iPad Air
    Hej,

    Jag håller på att skriva en klient-server applikation men får inte riktigt till det.

    Klienten kopplar upp sig mot servern (skriven i .net) och det fungerar bra och bygger upp sitt UI beroende på svar från servern, detta går också bra. Så länge jag skickar från klienten och servern svarar med en gång går det bra men nu till mitt problem.

    Servern skall också kunna skicka till klienten när något har hänt på samma socket. Socketen är ju öppen tills dess att programmet stängs ner (eller blir pausat).

    Jag får bara socketförbindelsen att fungerar riktigt när jag skickar något först och får svar med detsamma.

    Tacksam för hjälp.

    //Niklas
     
  2. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Svårt att säga vad du gjort för fel utan att få reda på mer om hur du skrivit din kod. Är det en service eller en activity som håller socketen? Vad använder du för strömmar? Hur läser/skriver du data? Gör servern flush? Håller du ett wake lock medans du kör?
     
  3. Niklas

    Niklas Youth Droid Medlem

    Blev medlem:
    1 jun 2009
    Inlägg:
    110
    Mottagna gillanden:
    24
    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro

    MINA ENHETER

    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro
    Platta:
    iPad Air
    Hej Kaj,

    Så här ser klassen ut som sköter kommunikationen. Det fungerar alltså ok att få svar från servern när jag väntar efter ett skickat meddelande.


    package se.ascom.laks.client.communication;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.InterruptedIOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;

    import android.app.Activity;
    import android.util.Log;

    public class ServiceCommunication{
    private static String _ip;
    private static int _port;
    private static Socket _socket;
    private static final String TAG = "ServiceCommunication";
    private static final int SOCKET_TIMEOUT = 5000; //set timeout to 5 seconds
    private boolean unsignaled = true;

    public static void setInitParams(String ip, int port){
    _ip = ip;
    _port = port;
    }
    public static boolean connect(){
    try{

    _socket = new Socket("172.20.46.149", _port);
    _socket.setSoTimeout(SOCKET_TIMEOUT);
    Log.i("Socket", "Socket uppkopplad ok");

    return true;
    }
    catch(InterruptedIOException e){
    Log.e(TAG, e.getMessage());
    return false;
    }
    catch(UnknownHostException e){
    Log.e("UnknownHostException", e.getMessage());
    return false;
    }
    catch(IOException e){
    Log.e("IOException", e.getMessage());
    return false;
    }
    catch(Exception e){
    Log.e(TAG, e.getMessage());
    return false;
    }
    }

    public static void closeConnection(String logoutRequest){
    String response = sendMessage(logoutRequest);
    try {
    _socket.close();
    } catch (IOException e) {
    Log.e(TAG, e.getMessage());
    }
    }

    public static String sendMessage(String message){
    Log.d("sendMessage()", "Ready to send message");
    try{

    PrintWriter writer = new PrintWriter(_socket.getOutputStream(), true);
    BufferedReader reader = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
    writer.println(message);

    String response = reader.readLine();

    Log.d(TAG, response);
    return response;
    }
    catch(IOException e){
    //Log.e(TAG, e.getMessage());
    return null ;
    }
    }
    }
     
  4. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Vad har du tänkt dig skall hända när servern skickar ett meddelande till dig och du inte väntar?

    Det man oftast gör är att man skapar en separat tråd som läser från InputStream och sedan postar lästa meddelanden på en kö. Din aktivitet betar sedan av kön.
     
    Niklas gillar detta.
  5. Niklas

    Niklas Youth Droid Medlem

    Blev medlem:
    1 jun 2009
    Inlägg:
    110
    Mottagna gillanden:
    24
    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro

    MINA ENHETER

    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro
    Platta:
    iPad Air
    Hej igen Kaj,

    Så du menar att man sätter själva InputStream till en bakgrundstråd som ligger och lyssnar hela tiden medans OutputStream är kvar som den är?

    Tack för att du ta dig tid för detta.
     
  6. Kaj

    Kaj Senior Droid Medlem

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

    MINA ENHETER

    Det hela beror på hur man vill att det skall fungera, men ja, det vanligaste är att man skickar meddelanden med den anropande tråden. I ditt fall vill du dock troligen göra ett trådbyte även där. Om du använder UI-tråden för att skicka meddelanden så kan tråden bli låst och användaren får "force close".

    Du skall ta emot meddelanden med en separat tråd. Kom ihåg att du även måste göra så att du kan meddela den tråden att den skall terminera, så att den inte fortsätter finnas kvar när användaren stänger ned ditt UI.
     
  7. Niklas

    Niklas Youth Droid Medlem

    Blev medlem:
    1 jun 2009
    Inlägg:
    110
    Mottagna gillanden:
    24
    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro

    MINA ENHETER

    Operatör:
    Telia företag
    Telefon:
    Pixel 6 Pro
    Platta:
    iPad Air
    Många tack för hjälpen Kaj, detta skall testas imorgon.

    //niklas