ServerSocket.accept() nie przyjmuje połączeń

0

Witam

chcę zrobić serwer nasłuchujący (na telefonie) na konkretnym porcie połączeń przychodzących. Obecnie mam taki kawałek kodu, jednak nie przyjmuje on połączeń - nie przechodzi poza accept

public class ConnectionListener {
    private ServerSocket serverSocket;
    public ConnectionListener(int port) throws IOException
    {
        serverSocket=new ServerSocket(port,0,InetAddress.getByName("10.0.0.106"));
    }
    
    public void getIncomingConnection() throws IOException
    {
        Socket incoming=serverSocket.accept();
        System.out.println(incoming.getInetAddress());
    }
}

// wywołania
            ConnectionListener cl=new ConnectionListener(1989);
            cl.getIncomingConnection();

// client który wysyła pakiety na zadany port

                    while (true) {
                        DatagramPacket w = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("10.0.0.106"), 1989);
                        s.send(w);
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Testowa.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }

Dodam tylko, że ma to działać na broadcast. Był początkowo adres 10.0.0.255 jednak działa to tak samo, a więc nie działa wcale:) 10.0.0.106 to na pewno adres mojego telefonu

0

Musisz się zdecydować. Albo używasz TCP albo UDP. Jeśli czekasz na accept() to znaczy ze chcesz transmisji połaczeniowej przez TCP, więc musisz zrobić connect() po stronie klienta.
A tu po stronie klienta nadajesz bezpołączeniowo przez UDP, w efekcie serwer nigdy nie doczeka sie na połączenie i nie będzie odbierał danych.
Więc albo robisz connect() w kliencie, albo w serwerze nie robisz accept() tylko od razu odbierasz.
Podsumowując lekcja na dziś: komunikacja sieciowa, z szczególnym uwzględnieniem TCP, UDP (i ewentualnie SCTP)

0

aa widzisz - późno jest i nawet nie zastanowiłem się nad tym, czy accept (a więc oczekiwanie na POŁĄCZENIE -tak jak sam wskazujesz - gdzie udp jest bezpołączeniowy) powinien łapać udpki ;] haha sierota ze mnie ;]

no dobrze, ale przecież connecta nie zrobie....
to powiedz w jaki sposób wyłapać pakiety broadcast? Po co mi to?

Ano chciałem zrobić taki myk - serwer na telefonie czeka na zgłoszenie - zgłoszenie w formie broadcastu, jako że nie znam adresu ip telefonu. Telefon to wyłapuje i wysyła informacje do nadawcy broadcastu na temat portu, i oczywiście tego że istnieje i można się z nim próbować łączyć na podanym porcie.
W jaki sposób więc zrobić taką "czekajkę" na pakiety idące po adresie rozgłoszeniowym?

edit:

czyżby

DatagramSocket socket = new DatagramSocket(1989, InetAddress.getByName("0.0.0.0"))
socket.receive(buff); // to będzie robiło za "czekajke" ?? niby rozmiar ramki znam przecież....
0

Już mnie to zaczyna drażnić...
W wielkim kodowym skrócie :

sender brodcastu:

                    DatagramSocket s = new DatagramSocket(3100);
                    s.setBroadcast(true);
                    byte[] buffer = new byte[1024];
                    while (true) {
                        DatagramPacket w = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("10.0.0.255"), 1989);
                        s.send(w);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Testowa.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }

Kod uruchomiony na telefonie z androidem i drugim lapku w sieci (kom i lapek po wifi)

                   DatagramSocket socket=new DatagramSocket(null);
                   socket.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"),1989));
                   DatagramPacket p=new DatagramPacket(new byte[10],10);
                   socket.receive(p);

O ile na lapku ten kod PRZECHODZI POZA receive - a więc odbiera i fajnie działa po broadcascie - o tyle na androidzie jest zwiecha na receive. Dlaczego ??
Jak to rozwiązać? Jakieś permy dodać dodatkowe do manifestu?

0

Nie rozwiązano tam problemu - jedyna konkluzja, że jednemu działało drugiemu nie....

0

Tym razem znaleziono rozwiązanie!
Dzięki za poświęcony czas!

1 użytkowników online, w tym zalogowanych: 0, gości: 1