하나의 스레드에서 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();
}
}
}
녹색 틱을 클릭하여이 대답을 수락하면 해결 된 문제를 표시 할 수 있습니다. –