Bu konuda bilgi edinmek için bir UDP testi uygulamaya çalışıyorum. Windows için bir sunucu uygulaması ve Android için bir istemci uygulaması var.UDP'de Datagram ile garip davranışlar Android'de işlev alıyor
Ev yapımı bir keşif hizmeti uygulamaya çalışıyorum. Sunucu sürekli bir dize ("LazyRemote") ile UDP paketleri dinliyor. Bu dize aldığında, istemciye başka bir dize gönderir ("LazyRemote_192.168.1.17: 2016") wireshark ile her iki yönde gönderilen verilerin doğru olduğunu kontrol ettim ama istemci uygulamasında yanlış bir şey alıyorum .
android için kod şudur:
buttonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progress.show();
//This code is executed when user clicks connect button. As it could be a long running operation, it's executed in a new thread to avoid blocking UI
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String ipAddress = "";
SocketClass my_socketClass = new SocketClass();
InetAddress UDPaddress = my_socketClass.getBroadcastAddress();
int UDPport = 15000;
if(initializationDone == false){
initializationDone = true;
try {
socket_send = new DatagramSocket();
socket_send.setBroadcast(true);
socket_send.setSoTimeout(6000);
socket_receive = new DatagramSocket(UDPport, InetAddress.getByName("0.0.0.0"));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
byte[] send_buff = "LazyRemote".getBytes();
DatagramPacket sendPacket = new DatagramPacket(send_buff, send_buff.length,UDPaddress,UDPport);
socket_send.send(sendPacket);
}catch (Exception ex){
showToast("Imposible enviar primer ack");
}
byte[] receive_buff = new byte[30];
DatagramPacket receivePacket = new DatagramPacket(receive_buff, receive_buff.length);
try {
socket_receive.receive(receivePacket);
String receivedData = new String(receivePacket.getData(), "UTF-8");
if (receivedData.contains("LazyRemote")) {
SocketClass my_socket = new SocketClass(receivePacket.getAddress().toString().substring(1), 2016);
SocketClass.ConnectionStatus connectionStatus = my_socket.establishConnection();
//Remove progressdialog after establishConnection finishes.
progress.dismiss();
//Check connection status.
if (connectionStatus.status == true) {
Thread.sleep(1000);
socket_receive.close();
socket_send.close();
Intent intent = new Intent(MainActivity.this, ActionPerformer.class);
startActivity(intent);
finish();
}
}
} catch (Exception ex) {
progress.dismiss();
showToast("No se han encontrado servidores");
}
//mLock.release();
}
});
thread.start();
}
});
sorun o fonksiyonu çalışıyor ama yanlış veri aldığı alma olduğunu. (İstemcinin, sunucuyu descovery ("LazyRemote")) başlatması için gönderdiği aynı dizgiyi alıyor.
Aptal bir hata olmalı ama çözemiyorum. Çok teşekkürler.
[Alınan UDP iletisinin yanlış uzunluğu var] olası kopyası (http://stackoverflow.com/questions/36533359/received-udp-message-has-incorrect-length) – EJP
Sorun, uzunluk değil. Gönderilmeyen bir şey alıyorum. Bence tamponlarla ilgili bir şey ama onu bulamıyorum. – Aldridge1991