Avatar billede grus Nybegynder
23. august 2012 - 21:38 Der er 8 kommentarer og
1 løsning

Socket kommunikation mellem Android og Java applikation

Jeg er igang med en skoleopgave der omfatter en Android app og en Java applikation. En del af opgaven går ud på at app'en skal give besked til Java applikationen når en bestemt hændelse indtræffer, i dette tilfælde at brugeren med mobilen, med app'en installeret, befinder sig inden for et bestemt geografisk område.
Java applikationen skal reagere ved at kalde nogle forskellige metoder.
Dette har jeg implementeret ved at lade Android'en agere klient og Java applikationen server og lade dem kommunikere med en Java Socket. Dette fungere fint, dog kun så længe mobilen og computeren med hhv app'en og Java applikationen benytter samme netværk. Flytter jeg mog for langt væk med mobilen tvinges app'en til at stoppe.
Er der en måde jeg kan omgås dette? Jeg overvejede at benytte HTTP men det duer vel kun ved kald til HTTP-server og det er der jo ikke tale om her.
Avatar billede arne_v Ekspert
23. august 2012 - 21:45 #1
Du kan godt embedde en HTTP server i en standalone Java app.

Men maaske kan du noejes med at justere nogle socket timeouts.
Avatar billede grus Nybegynder
24. august 2012 - 09:09 #2
Tak for hurtigt svar. Jeg skal lige være helt med på hvad du mener.
HTTP: Hvis jeg embedder en http server i java app'en, kan jeg så kalde den med fx Java URLConnection() og bruge IP nummer?
Socket: Kan du fortælle hvordan jeg justere socket timeouts? Er det noget jeg kan gøre i koden?
Avatar billede arne_v Ekspert
25. august 2012 - 02:46 #3
Ja.

Her er et lille eksempel paa embedding af Jetty i en Java SE console app:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class WebServer extends AbstractHandler {
    private Map<String, Integer> counter = new HashMap<String, Integer>();
    public void handle(String target, Request req, HttpServletRequest httpreq, HttpServletResponse httpresp) throws IOException, ServletException {
        int n;
        String path = httpreq.getPathInfo();
        if(counter.containsKey(path)) {
            n = counter.get(path) + 1;
        } else {
            n = 1;
        }
        httpresp.setContentType("text/html");
        httpresp.setStatus(HttpServletResponse.SC_OK);
        PrintWriter pw = httpresp.getWriter();
        pw.println("<html>");
        pw.println("<head>");
        pw.println("<title>Hit counter</title>");
        pw.println("</head>");
        pw.println("<body>");
        pw.println("<h1>Hit counter</h1>");
        pw.println("<p>" + path + " has " + n + " hits</p>");
        pw.println("</body>");
        pw.println("</html>");
        pw.flush();
        counter.put(path, n);
        req.setHandled(true);
    }
    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        server.setHandler(new WebServer());
        server.start();
        server.join();
    }
}
Avatar billede arne_v Ekspert
25. august 2012 - 02:49 #4
http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html

naevner nogle settings.

sun.net.client.defaultConnectTimeout (default: -1)
sun.net.client.defaultReadTimeout (default: -1)
    These properties specify the default connect and read timeout (resp.) for the protocol handler used by java.net.URLConnection.

    sun.net.client.defaultConnectTimeout specifies the timeout (in milliseconds) to establish the connection to the host. For example for http connections it is the timeout when establishing the connection to the http server. For ftp connection it is the timeout when establishing the connection to ftp servers.

    sun.net.client.defaultReadTimeout specifies the timeout (in milliseconds) when reading from input stream when a connection is established to a resource.
Avatar billede arne_v Ekspert
25. august 2012 - 02:50 #5
System.setProperty( "sun.net.client.defaultConnectTimeout", "10000");
System.setProperty( "sun.net.client.defaultReadTimeout", "10000");
Avatar billede grus Nybegynder
02. september 2012 - 21:46 #6
Jeg kigger på dem. Tak.
Avatar billede arne_v Ekspert
02. september 2012 - 21:51 #7
men du er saa sikker paa at de ikke virker at du valgte selv at tage point med det samme??
Avatar billede grus Nybegynder
02. september 2012 - 22:03 #8
Nej for fanden undskyld, jeg misforstod systemet. De skulle være tildelt dig. Kan jeg rette det på en måde?
Avatar billede arne_v Ekspert
02. september 2012 - 22:07 #9
Proceduren i http://www.eksperten.dk/faq#faq-5-3 bruges nogle gange i situationer som denne.
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