Соединение двух устройств через Wi-Fi с помощью сокетов - PullRequest
0 голосов
/ 22 мая 2011

Я написал код для сокетов сервера и клиента. Я использовал потоки, используя обработчик. Но это часто дает исключение, что Только исходный поток, который создал иерархию представления, может касаться его представлений Как управлять этим?

Вот код для сокета сервера

 public class ServerThread implements Runnable {

    public void run() { 
        try {
            Looper.prepare();
            if (SERVERIP != null) {
                handler.post(new Runnable() {
                    public void run() {
                        serverStatus.setText("Listening on IP: " + SERVERIP);
                    }
                });
                serverSocket = new ServerSocket(SERVERPORT);
                Toast.makeText(getApplicationContext(), serverSocket.getLocalSocketAddress().toString()
                , Toast.LENGTH_LONG).show();
                serverStatus.append("\n"+serverSocket.getLocalSocketAddress().toString());
                while (true) {
                    // listen for incoming clients
                    Socket client = serverSocket.accept();

                            serverStatus.setText("Connected.");


                    try {
                        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) {
                            Log.d("ServerActivity", line);
                            handler.post(new Runnable() {
                                public void run() {

                                }
                            }); 
                        }
                        break;
                    } catch (Exception e) {
                        handler.post(new Runnable() {
                            public void run() {
                                serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                            }
                        });
                        e.printStackTrace();
                    }
                }
            } else {
                handler.post(new Runnable() {
                    public void run() {
                        serverStatus.setText("Couldn't detect internet connection.");
                    }
                });
            }
        } catch (final Exception e) {
            handler.post(new Runnable() {
                public void run() {
                    serverStatus.setText("Error"+e.getMessage());

                }
            });
            e.printStackTrace();
        }
    }
}

код для клиентского сокета

  public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, 8080);
            connected = true;

                try {
                    console.append("\nC: Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);
                        // where you issue the commands
                        out.println("Hey Server!");
                        console.append("C: Sent.");
                } catch (Exception e) {
                    console.append("S: Error= "+ e.getMessage());
                }

            socket.close();
            console.append("\nC: Closed.");
        } catch (Exception e) {
            Log.e("Client :", e.getMessage());

            //console.append("\nC: Error= ");
            connected = false;
        }
    }
}

Здесь консоль - текстовое представление, в котором я пытаюсь разместить несколько сообщений. Я могу видеть сообщения в журнале, но не в текстовом представлении

1 Ответ

1 голос
/ 22 мая 2011

Только исходный поток, создавший иерархию представлений, может касаться его представлений. Как управлять этим?

Использовать runOnUiThread().Или используйте Handler.Или используйте post().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...