Я пытаюсь получить хорошее представление о UDP на Android, поэтому я пишу небольшую тестовую программу, чтобы установить 2 сокета на одном компьютере, отправить пакет и получить его. Я думал, что это будет просто, но что-то идет не так. Мой код:
DatagramSocket server;
DatagramSocket client;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Initialize a client socket and a server socket using UDP
try {
server = new DatagramSocket();
client = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Server will now send some data
String data = "This is a test";
DatagramPacket sendPacket = new DatagramPacket(data.getBytes(), data.length(),
client.getInetAddress(), client.getLocalPort());
try {
server.send(sendPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Client has to receive and read the data
byte[] buf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
try {
client.receive(receivePacket);
byte[] receivedData = receivePacket.getData();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
server.disconnect();
client.disconnect();
}
Когда я отлаживаю свой код, он переходит к последней попытке, в «client.receive(receivePacket);
», но никогда не возвращается после вызова этой функции. Пакет, кажется, никогда не принимается, но мне трудно понять, почему это так.
Я надеюсь, что кто-нибудь может помочь мне решить эту проблему.
РЕДАКТИРОВАТЬ: Новый код с использованием потоков. Вызов «получить» перед фактической отправкой пакета. Попытка использовать AsyncTask.
public class udpexample extends Activity {
DatagramSocket server;
DatagramSocket client;
String data = "This is a test";
private static final String TAG = "UDPExampleActivity";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "Starting");
// Initialize a client socket and a server socket using UDP
try {
server = new DatagramSocket();
client = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new ReceivePacket().execute();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Server will now send some data
DatagramPacket sendPacket = new DatagramPacket(data.getBytes(), data.length(),
client.getInetAddress(), client.getLocalPort());
try {
Log.i(TAG, "About to send");
server.send(sendPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class ReceivePacket extends AsyncTask<Void, Void, Void> {
// Thread used to receive a packet
@Override
protected Void doInBackground(Void... params) {
// Client has to receive and read the data
byte[] buf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
try {
Log.i(TAG, "About to receive");
client.receive(receivePacket);
byte[] receivedData = receivePacket.getData();
// Verify that the packet is identical to the one being sent
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result) {
server.disconnect();
client.disconnect();
}
}
}
Все еще с той же проблемой, он останавливается и ждет при получении, и ничего не происходит.
Большое спасибо,
Jary