Maison  >  Questions et réponses  >  le corps du texte

java - 安卓利用Socket和PC通信无法连接?

  1. 安卓利用Socket和PC通信无法连接

  2. 已经设置了 <uses-permission android:name="android.permission.INTERNET"/>

  3. 相同代码PC端和PC端通信没有问题

  4. 会在new Socket(ip,port)这里一直堵塞;

服务器代码

public ServiceThread(Socket s) throws IOException {
        socket = s;
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                .getOutputStream())), true);
        in=socket.getInputStream();
    }

    public void run() {
        try {
            out.println("SERVER DATA");
            System.out.println("closing...");
            byte[] temp = new byte[1024];
            int length=-1;
            while((length=in.read(temp))>0){
                System.out.println(temp);
            }
            out.close();
            socket.close();
        } catch (Exception e) {
        }
    }
}

public class MyServer {
    static final int PORT = 8778;

    public static void main(String[] args) throws IOException {
        ServerSocket s = new ServerSocket(PORT);
        System.out.println("Server 启动");
        Socket socket = s.accept();
        ServiceThread t = new ServiceThread(socket);
        t.start();
    }
}

客户端代码

Socket socket = null;
                BufferedWriter out = null;
                try {
                    socket = new Socket(ip, 8778);
                    out = new BufferedWriter(new OutputStreamWriter(socket
                            .getOutputStream()));
                    out.write(sendViewA.getText().toString());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                Socket socket = null;
                BufferedReader in = null;
                try {
                    socket = new Socket(ip, 8778);
                    in = new BufferedReader(new InputStreamReader(socket
                            .getInputStream()));
                    String fromServerStr = in.readLine();
                    Toast.makeText(OUTActivity.this,fromServerStr,Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
PHP中文网PHP中文网2716 Il y a quelques jours839

répondre à tous(6)je répondrai

  • 迷茫

    迷茫2017-04-18 10:55:50

    Cela devrait être un problème IP :

    1. Si votre appareil est un émulateur : veuillez vérifier l'adresse IP de l'émulateur correspondant pour accéder à l'hôte de l'ordinateur. Généralement, elle est disponible sur le site officiel de l'émulateur correspondant (l'adresse IP spécifique des différents émulateurs est différente) <. 🎜>

    1. Genymotion : 10.0.3.2

    2. Émulateur Android : 10.0.2.2

    2. Si votre appareil est une vraie machine, il est préférable de vous assurer que le téléphone mobile et la vraie machine sont sur le même réseau local (s'il s'agit d'un ordinateur portable, il est recommandé d'utiliser le téléphone mobile pour se connecter au ordinateur WiFi avant d'y accéder). Vous pouvez vérifier vous-même l'adresse IP dans cmd

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:55:50

    J'ai déjà rencontré ce problème une fois. Essayez de changer le code de connexion du socket du client par le suivant.
    Client :

    socket = new Socket();
    socket.connect(new InetSocketAddress("1.1.9.30",8080), 5000);
    

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:55:50

    Si le téléphone mobile et le PC sont tous deux sur le même réseau local, vous devez vérifier si l'isolation sans fil est activée sur le routeur. Cela peut également être un piège.

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:55:50

    En regardant votre rapport d'erreur, avez-vous laissé le Socket s'exécuter dans le fil de discussion de l'interface utilisateur ? ——Sur Android, après Android 4.0, Socket n'est pas autorisé à être utilisé dans le thread de l'interface utilisateur et un nouveau thread doit être démarré pour utiliser Socket

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:55:50

    NetworkOnMainThreadException, cela implique-t-il des opérations liées au Socket dans le thread principal ?
    Laissez le code s'exécuter en premier. En supposant que votre code client actuel soit écrit dans startClient(), vous devez mettre ce code dans un thread enfant pour. exécution :

    
    new Thread(new Runnable() {
            @Override
            public void run() {
                startClient();
            }
        }).start();
        

    En fait, vous devez également gérer l'interaction entre ce thread et le thread principal (thread UI), qui est liée au code métier
    Il est recommandé de d'abord comprendre la différence/relation entre le thread principal. (thread UI) et sous-threads, puis jetez un œil à la mise en œuvre de la communication par thread.

    répondre
    0
  • 阿神

    阿神2017-04-18 10:55:50

    Le journal indique clairement "exception réseau sur le thread principal". Utilisons un thread nouvellement ouvert pour effectuer les opérations réseau comme mentionné ci-dessus

    répondre
    0
  • Annulerrépondre