2017-05-23 3 views
0

J'essaie d'exécuter l'application pour envoyer un paquet udp au serveur. Il fonctionne parfaitement sur l'émulateur mais pas sur le périphérique physique. J'ai vérifié les réponses possibles (autorisations Internet). Cependant, dans mon cas, j'ai fourni les autorisations, mais cela ne fonctionne toujours pas. Toute aide est appréciée.Les sockets android fonctionnent sur l'émulateur mais pas sur le vrai périphérique

Code de l'application:

import android.os.Message; 
 
import android.util.Log; 
 

 
import java.io.IOException; 
 
import java.net.DatagramPacket; 
 
import java.net.DatagramSocket; 
 
import java.net.InetAddress; 
 
import java.net.SocketException; 
 
import java.net.UnknownHostException; 
 

 

 
import android.app.Activity; 
 
import android.content.Context; 
 
import android.os.Message; 
 
import android.util.Log; 
 
import android.widget.Toast; 
 
import android.os.Handler; 
 

 
public class UdpClientThread extends Thread{ 
 

 
    String dstAddress; 
 
    int dstPort; 
 
    private boolean running; 
 
    MainActivity.UdpClientHandler handler; 
 
    DatagramSocket socket; 
 
    InetAddress address; 
 

 
    public UdpClientThread(String addr, int port, MainActivity.UdpClientHandler handler) { 
 
     super(); 
 
     dstAddress = addr; 
 
     dstPort = port; 
 
     this.handler = handler; 
 
    } 
 

 
    public void setRunning(boolean running){ 
 
     this.running = running; 
 
    } 
 

 
    private void sendState(String state){ 
 
     handler.sendMessage(
 
       Message.obtain(handler, 
 
         MainActivity.UdpClientHandler.UPDATE_STATE, state)); 
 
    } 
 

 
    @Override 
 
    public void run() { 
 
     sendState("connecting..."); 
 

 
     running = true; 
 

 
     try { 
 
      socket = new DatagramSocket(); 
 

 
      address = InetAddress.getByName(dstAddress); 
 

 
      // send request 
 
      byte[] buf = new byte[256]; 
 

 
      DatagramPacket packet = 
 
        new DatagramPacket(buf, buf.length, address, dstPort); 
 

 
      socket.send(packet); 
 

 
      sendState("connected"); 
 

 
      // get response 
 
      packet = new DatagramPacket(buf, buf.length); 
 
      socket.receive(packet); 
 
      String line = new String(packet.getData(), 0, packet.getLength()); 
 

 
      handler.sendMessage(
 
        Message.obtain(handler, MainActivity.UdpClientHandler.UPDATE_MSG, line)); 
 

 
     } catch (SocketException e) { 
 
      e.printStackTrace(); 
 
     } catch (UnknownHostException e) { 
 
      e.printStackTrace(); 
 
     } catch (IOException e) { 
 
      e.printStackTrace(); 
 
     } finally { 
 
      if(socket != null){ 
 
       socket.close(); 
 
       handler.sendEmptyMessage(MainActivity.UdpClientHandler.UPDATE_END); 
 
      } 
 
     } 
 

 
    } 
 
}

import android.os.Bundle; 
 
import android.support.design.widget.FloatingActionButton; 
 
import android.support.design.widget.Snackbar; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.support.v7.widget.Toolbar; 
 
import android.view.View; 
 
import android.view.Menu; 
 
import android.view.MenuItem; 
 

 
import android.content.Context; 
 
import android.support.design.widget.FloatingActionButton; 
 
import android.os.Message; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.view.View; 
 
import android.widget.Button; 
 
import android.widget.EditText; 
 
import android.widget.TextView; 
 
import android.os.Handler; 
 

 

 
public class MainActivity extends AppCompatActivity { 
 

 
    EditText editTextAddress, editTextPort; 
 
    Button buttonConnect; 
 
    TextView textViewState, textViewRx; 
 

 
    UdpClientHandler udpClientHandler; 
 
    UdpClientThread udpClientThread; 
 

 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
     editTextAddress = (EditText) findViewById(R.id.address); 
 
     editTextPort = (EditText) findViewById(R.id.port); 
 
     buttonConnect = (Button) findViewById(R.id.connect); 
 
     textViewState = (TextView)findViewById(R.id.state); 
 
     textViewRx = (TextView)findViewById(R.id.received); 
 

 
     buttonConnect.setOnClickListener(buttonConnectOnClickListener); 
 

 
     udpClientHandler = new UdpClientHandler(this); 
 

 
    } 
 

 
    View.OnClickListener buttonConnectOnClickListener = 
 
      new View.OnClickListener() { 
 

 
       @Override 
 
       public void onClick(View arg0) { 
 

 
        udpClientThread = new UdpClientThread(
 
          editTextAddress.getText().toString(), 
 
          Integer.parseInt(editTextPort.getText().toString()), 
 
          udpClientHandler); 
 
        udpClientThread.start(); 
 

 
        buttonConnect.setEnabled(false); 
 
       } 
 
      }; 
 

 
    private void updateState(String state){ 
 
     textViewState.setText(state); 
 
    } 
 

 
    private void updateRxMsg(String rxmsg){ 
 
     textViewRx.append(rxmsg + "\n"); 
 
    } 
 

 
    private void clientEnd(){ 
 
     udpClientThread = null; 
 
     textViewState.setText("clientEnd()"); 
 
     buttonConnect.setEnabled(true); 
 

 
    } 
 

 
    public static class UdpClientHandler extends Handler { 
 
     public static final int UPDATE_STATE = 0; 
 
     public static final int UPDATE_MSG = 1; 
 
     public static final int UPDATE_END = 2; 
 
     private MainActivity parent; 
 

 
     public UdpClientHandler(MainActivity parent) { 
 
      super(); 
 
      this.parent = parent; 
 
     } 
 

 
     @Override 
 
     public void handleMessage(Message msg) { 
 

 
      switch (msg.what){ 
 
       case UPDATE_STATE: 
 
        parent.updateState((String)msg.obj); 
 
        break; 
 
       case UPDATE_MSG: 
 
        parent.updateRxMsg((String)msg.obj); 
 
        break; 
 
       case UPDATE_END: 
 
        parent.clientEnd(); 
 
        break; 
 
       default: 
 
        super.handleMessage(msg); 
 
      } 
 

 
     } 
 
    } 
 
}

fichier Manifest:

<?xml version="1.0" encoding="utf-8"?> 
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 
    package="com.example.habbas.traficapp"> 
 
    <uses-permission android:name="android.permission.INTERNET" /> 
 
    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" 
 
     android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" 
 
     android:supportsRtl="true" android:theme="@style/AppTheme"> 
 
     <activity android:name=".MainActivity" android:label="@string/app_name" 
 
      android:theme="@style/AppTheme.NoActionBar"> 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.MAIN" /> 
 

 
       <category android:name="android.intent.category.LAUNCHER" /> 
 
      </intent-filter> 
 
     </activity> 
 
    </application> 
 

 
</manifest>

Disposition:

<?xml version="1.0" encoding="utf-8"?> 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    android:padding="16dp" 
 
    android:orientation="vertical" 
 
    tools:context="com.example.habbas.traficapp.MainActivity"> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_gravity="center_horizontal" 
 
     android:autoLink="web" 
 
     android:text="http://android-er.blogspot.com/" 
 
     android:textStyle="bold" /> 
 
    <EditText 
 
     android:id="@+id/address" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:text="192.168.1.45" 
 
     android:hint="dstAddress" /> 
 
    <EditText 
 
     android:id="@+id/port" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:text="1254" 
 
     android:hint="dstPort" /> 
 
    <Button 
 
     android:id="@+id/connect" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:text="Connect"/> 
 

 
    <TextView 
 
     android:id="@+id/state" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:text="un-initiated" 
 
     android:textSize="20dp"/> 
 

 
    <TextView 
 
     android:id="@+id/received" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:textSize="18dp"/> 
 
</LinearLayout>

+1

Quelle est l'erreur? Vous liez le port UDP pour recevoir des paquets? – t0mm13b

+0

@ t0mm13b Il n'y a pas d'erreur. Et je pense que je lie au port depuis un constructeur vide se lie au port disponible –

Répondre

0

Le problème a été résolu par le liant avec le port spécifique sur la construction de la douille udp.

code:

socket = new DatagramSocket (3000); // La méthode correcte pour le lier à un port spécifique

address = InetAddress.getByName (dstAddress);