마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

UDP 소켓 통신의 전달 확인 문제

0 추천

UDP로 브로드캐스팅하는 소켓 프로그램을 만들고 있습니다.

 
socket = new DatagramSocket(SERVER_PORT);
socket.setBroadcast(true);
 
이런 식으로 소켓을 뚫어서
 
DatagramPacket packet = new DatagramPacket(text1.getBytes(), text1.getBytes().length, InetAddress.getByName(255.255.255.255), SERVER_PORT);

이런 식으로 전송하고

public class MessageReciver extends Thread {
public void run() {
try {
 
while (keepRunning) {
byte[] buffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
 
socket.receive(packet);
}catch (IOException e) {
e.printStackTrace();
}
}
 
이렇게 받습니다.
 
정말 간략하게 썻지만 정말로 입출력이 잘 됩니다.
문제는 "한번"에 안간다는 겁니다.
전송을 하면, 안가는데, 두번쨰 시도하면 안갑니다. 근데 그 이후로 하는 시도는 한번에 척척 잘 가집니다.
그리고 한 30초정도 IDLE타임을 갖고 또 시도하면 안갑니다. 두번째 혹은 세번째부터 척척가기 시작합니다.
 
아무래도 TCP라면 전송이 안되면 다시시도해서 전송신뢰성을 보장하겠지만 UDP는 그렇지도 않고,
제 좁은 소견으로는 UDP의 특성이라기보다는 안드로이드폰 자체가 잠깐이라도 IDLE타임에는
보낼 준비 혹은 받을 준비를 하지 않고 있는 것 같습니다, socket.recv(packet); 스레드를 계속 돌려도 말입니다.
 
어디서 줏어들은 바로
if (wifiLock == null) {
   WifiManager wifiManager = (WifiManager) this.getSystemService(this.WIFI_SERVICE);
   wifiLock = wifiManager.createWifiLock("wifilock");
   wifiLock.setReferenceCounted(true);
   wifiLock.acquire();
}
도 추가시키고 퍼미션도 줬는데 결과는 마찬가지입니다.
한번에 안 갑니다.
 
혹시 안펍 고수분들 중에 해결 방법이 있으신분 알려주시면 감사하겠습니다.

 

ifreeta (260 포인트) 님이 2013년 10월 31일 질문

1개의 답변

0 추천
첫번째 시도할 때 일부러 좀 큰 패킷을 보내보세요.
Darklake (720 포인트) 님이 2013년 10월 31일 답변
중간에 30초만 쉬어도 같은 현상이 발생하는데
이런 현상이 발생할 시점만 큰 패킷을 보내는 방법이 있을까요?
무한루프 돌리는거 말고 일정주기마다 콜백해주는 방법이 있을까요?
글쎄요 UDP를 쉬었다 보낸다는 개념이 좀 잘못된것 아닌가 싶네요. 데이터가 다 갔으면 끊었다가 다시 접속해야 하는것 아닐런지요?
그리고 큰 패킷을 보내라고 한 것은.. TCP와는 달리 UDP는 한 패킷의 데이터가 다 차야 보내는걸로 알고 있습니다. 그래서 해 보시라고 한거고.. 해결법이 아닐수도 있습니다.
...