2016-07-30 36 views
-2

Ich bin neu in Android und ich habe an diesem Bug für eine Weile gearbeitet, aber immer noch nicht herausgefunden. Ich versuche, eine Nachricht von meinem Smartphone an einen Server auf meinem Laptop zu senden. Das Problem ist, dass es aus irgendeinem Grund beim Erstellen eines Sockets abstürzt (nicht sofort, sondern nach ein paar Sekunden). Obwohl ich die Berechtigungen (.INTERNET) habe und den Code in einem separaten Thread ausführen, schlägt es noch fehl.Der Code Socket clientSocket = new Socket(); Abstürze in Android App sogar in separaten Thread

public class Communcation extends Activity{ 
private Socket s = null; 
short REDIRECTED_SERVERPORT = 5000; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_communcation); 

    final EditText msg = (EditText) findViewById(R.id.etMsg); 
    Button send = (Button) findViewById(R.id.bSend); 
    final TextView convo = (TextView) findViewById(R.id.tvConvo); 
    convo.setText(""); 
    final TextView status = (TextView) findViewById(R.id.tvStatus); 
    status.setText(""); 
    Button connect = (Button) findViewById(R.id.btnConnect); 
    final EditText ipaddress = (EditText) findViewById(R.id.address); 

    connect.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      status.setText("Estabilishing the connection to " + ipaddress.getText().toString()); 
      new Thread() { 
       public void run() { 
        try { 
         s = new Socket(InetAddress.getByName(ipaddress.getText().toString()), REDIRECTED_SERVERPORT); 
         status.setText("Established connection.."); 
        } catch (IOException e) { 
         status.setText("Failed the connection" + e.getMessage()); 
        } 
       } 
      }.start(); 
     } 
    }); 

    send.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String message = msg.getText().toString(); 
      new Thread() { 
       public void run() { 
        PrintWriter outp = null; 
        BufferedReader inp = null; 
        String serverMsg = null; 

        try { 
         outp = new PrintWriter(s.getOutputStream(), true); 
         inp = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        } catch (IOException e) { 
         status.setText("Couldn't initate the buffers "); 
        } 

        outp.write(message); 
       } 
      }.start(); 
     } 
    }); 
} 

}

Auf meinem Server-Side-Code warte ich auf eine Verbindung und eine Nachricht drucken, sondern den Code von der Prüfung so weit es geht nie das Teil übernehmen.

while (1) 
{ int clientfd; 
    struct sockaddr_in client_addr; 
    int addrlen=sizeof(client_addr); 

    /*---accept a connection (creating a data pipe)---*/ 
    printf("[SERVER] Waiting for clients\n"); 
    clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen); 
    printf("%s:%d connected\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 

    recv(clientfd, buffer, MAXBUF, 0); 
    printf("[SERVER] Received from the client: [%s]\n", buffer); 

    /*---Close data connection---*/ 
    close(clientfd); 
} 
+1

Veröffentlichen Sie Ihre Stack-Ablaufverfolgung. –

+0

"Der Code stürzt ab" ist keine Problembeschreibung. – EJP

Antwort

0

Eigentlich kann ich in diesem Fall ohne es sagen. Sie legen den Text der Textansicht auf demselben Thread fest. Sie können Ansichten nur im UI-Thread berühren. Sie müssen entweder ein Runnable an einen Handler senden oder runOnUiThread für den UI-Code verwenden.