Я написал код для сокетов сервера и клиента.
Я использовал потоки, используя обработчик. Но это часто дает исключение, что Только исходный поток, который создал иерархию представления, может касаться его представлений
Как управлять этим?
Вот код для сокета сервера
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;
}
}
}
Здесь консоль - текстовое представление, в котором я пытаюсь разместить несколько сообщений.
Я могу видеть сообщения в журнале, но не в текстовом представлении