Android de se connecter à de partage de connexion de socket

j'ai 2 appareils android, l'un agit comme un serveur qui est en mode d'attache, et accepte les connexions à un port. L'autre périphérique agit comme un client qui se connecte au hotspot du serveur et établit une connexion au serveur via un port. (Tout se fait sans routeur au milieu).

le code du serveur ressemble à ceci: (quand le serveur android exécute le code, l'appareil est en mode d'attache)

ServerSocket server = new ServerSocket(PORT);

while (true) {
    Socket client;
    client = server.accept();
    ClientThread com = new ClientThread(client, this);
    Thread t = new Thread(com);
    t.start();
}

le code client ressemble à ceci: (quand le le client android exécute ce code, l'appareil est connecté au point d'accès)

Socket client = new Socket();
int serverIP = wifiManager.getDhcpInfo().serverAddress;
String stringIP = android.text.format.Formatter.formatIpAddress(serverIP);
InetAddress address = InetAddress.getByName(stringIP);
SocketAddress socketAddress = new InetSocketAddress(address, PORT);
client.connect(socketAddress);

j'obtiens l'erreur suivante sur le client

java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable)
  at libcore.io.IoBridge.connect(IoBridge.java:114)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
  at java.net.Socket.connect(Socket.java:842)
  at java.net.Socket.connect(Socket.java:785)
  at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283)
  at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189)
  at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59)
  at java.lang.Thread.run(Thread.java:856)
Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
  at libcore.io.Posix.connect(Native Method)
  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
  at libcore.io.IoBridge.connect(IoBridge.java:112)
... 8 more

Le serveur ne donne aucune erreur.

j'ai l'autorisation suivante définie dans le fichier manifeste android:

<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>

idéalement, j'aurais besoin de transférer certaines données du serveur au client.

Qu'est-ce que je fais de mal?

31
demandé sur user2613971 2013-07-24 20:06:35

3 réponses

en testant il s'avère que la connexion ne peut pas être établie sur le dispositif d'attache.

mais si nous inversons le processus et ouvrons un serversocket sur le client connecté. Et connectez - vous à lui à partir du dispositif d'attache, il fonctionnera.

donc inverser la communication est la réponse.

14
répondu user2613971 2013-07-29 15:31:28

Côté Serveur

class ServerThread implements Runnable {

    public void run() {
        socket = new Socket();

        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {
            try {
                    socket = serverSocket.accept();

                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Côté Client

class ClientThread implements Runnable {

    @Override
    public void run() {
        try {
            socket = new Socket();
            InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT);
            socket.connect(socketAddress);

            CommunicationThread commThread = new CommunicationThread(socket);
            new Thread(commThread).start();

        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}
2
répondu Arya 2015-12-02 06:34:00

dans une connexion wifi captée, le fournisseur de connexion ne peut pas travailler en tant que client. Nous devons donc mettre en œuvre une connexion bidirectionnelle de socket tcp. Utilisez une socket de serveur avec un numéro de port dans le périphérique qui est en mode d'attache. Cet appareil agir en tant que serveur. Dans le périphérique client, utilisez socket pour accéder au port client avec adresse IP.

1
répondu Akhil Jayakumar 2017-08-11 11:39:54