2014-07-16 3 views
2

하나의 스레드에서 DatagramSocket을 사용하여 수신하고 다른 스레드에서 PC (Java)로 데이터를 전송합니다. 그러나 단지 1 초마다 데이터를 전송하지만 수신하지는 않습니다. 그러나 코드를 보낸 후 동일한 스레드에 코드를 넣으면 ... 작동 ... 하지만 각 데이터를 동시에 보내고 모든 데이터를 기다리고 싶습니다 ...안드로이드에서 Datagramsocket을 동시에 사용하여 보내고 받으십시오. 보내시겠습니까?

편집 : 발견했습니다. 문제는 두 개의 다른 스레드에서 포트를 열 수 없다는 것입니다. 이제 내 질문은 매 1 초마다 DatagramSocket.Receive()을 취소하고 내 데이터를 보내고 다시 수신 할 수 있다는 것입니다. 내가 답을 발견

public class MainActivity extends ActionBarActivity { 

TextView status; 
GPSTracker gps; 
boolean started = false; 
boolean waitting = false; 
String mess = "Waiting ..."; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    status = (TextView) findViewById(R.id.status); 

    gps = new GPSTracker(MainActivity.this); 

    Timer time = new Timer(); // Instantiate Timer Object 
    ScheduledTask st = new ScheduledTask(); 
    time.schedule(st, 0, 1000); // Create Repetitively task for every 1 secs 
} 

public class SendThread implements Runnable { 
    private DatagramSocket mySocket; 

    public void run() { 
     try { 
      InetAddress receiverHost = InetAddress.getByName("192.168.0.1"); 
      int receiverPort = Integer.parseInt("8080"); 
      String message = "Lat:0-Long:0"; 
      if (gps.canGetLocation()) { 
       double latitude = gps.getLatitude(); 
       double longitude = gps.getLongitude(); 
       message = "Lat:" + latitude + "-Long:" + longitude; 
      } else { 
       gps.showSettingsAlert(); 
      } 
      mySocket = new DatagramSocket(); 
      byte[] sendBuffer = message.getBytes(); 
      DatagramPacket packet = new DatagramPacket(sendBuffer, 
        sendBuffer.length, receiverHost, receiverPort); 
      mySocket.send(packet); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class RecieveThread implements Runnable { 
    public void run() { 
     try { 
      Log.i("1", "1"); 
      DatagramSocket mySocket = new DatagramSocket(8080); 
      waitting = true; 
      // to receive a message 
      int MESSAGE_LEN = 60; 
      byte[] recvBuffer = new byte[MESSAGE_LEN]; 
      DatagramPacket datagram = new DatagramPacket(recvBuffer, 
        MESSAGE_LEN); 
      Log.i("2", "2"); 
      mySocket.receive(datagram); 
      Log.i("Recieved", "Recieved"); 
      String recvdString = new String(recvBuffer); 
      mess = recvdString; 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        status.setText(mess); 
       } 
      }); 
      mySocket.close(); 
      waitting = false; 
     } catch (Exception e) { 
      waitting = false; 
      e.printStackTrace(); 
     } 
    } 
} 

public class ScheduledTask extends TimerTask { 
    public void run() { 
     if (!waitting) { 
      Thread rThread = new Thread(new RecieveThread()); 
      rThread.start(); 
     } 
     Thread sThread = new Thread(new SendThread()); 
     sThread.start(); 
    } 
} 
} 

답변

3

: 나는 포트와 동일한 포트에서 데이터를 수신하는 또 다른 하나를 통해 데이터를 전송하기 위해 두 개의 서로 다른 소켓 하나를 사용합니다. (두 개의 다른 스레드) 첫 번째 것은 이 포트에을 연결하고 두 번째 포트는 을 해당 포트에 연결해야합니다. 등 모든 것이 잘 작동합니다.

+0

녹색 틱을 클릭하여이 대답을 수락하면 해결 된 문제를 표시 할 수 있습니다. –

관련 문제