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

소켓 관련 로그좀 봐주세요.

0 추천
11-07 08:11:40.308: E/THREAD(3533): Socket closed
11-07 08:11:40.308: W/System.err(3533): java.net.SocketException: Socket closed
11-07 08:11:40.308: W/System.err(3533): at libcore.io.Posix.recvfromBytes(Native Method)
11-07 08:11:40.308: W/System.err(3533): at libcore.io.Posix.recvfrom(Posix.java:131)
11-07 08:11:40.308: W/System.err(3533): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
11-07 08:11:40.308: W/System.err(3533): at libcore.io.IoBridge.recvfrom(IoBridge.java:503)
11-07 08:11:40.308: W/System.err(3533): at java.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:161)
11-07 08:11:40.308: W/System.err(3533): at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:169)
11-07 08:11:40.316: W/System.err(3533): at java.net.DatagramSocket.receive(DatagramSocket.java:254)
11-07 08:11:40.316: W/System.err(3533): at com.example.student.LocalService$MessageReciver.run(LocalService.java:184)
 
 
이러고 나서 더이상 수신이 안됩니다...
 
해당 소스는 이렇습니다.
 
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);
				
				PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
				if(!pm.isScreenOn()) {
					screen = false;
					while(!screen) 
						Thread.sleep(1000);
				}
				byte[] result = new byte[packet.getLength()];
				System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
				
				chatMessage = new String(result, 0, packet.getLength(), "UTF-8");				
				Message message = handler.obtainMessage(1, chatMessage);
					handler.sendMessage(message);
	
			}
		} catch (IOException e) {
	        Log.e("THREAD", e.getMessage()); 
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
	        Log.e("THREAD", e.getMessage()); 
			e.printStackTrace();
		}
	}
}

 

로컬 서비스 클래스에서 선언하고 start시킨 스레드입니다.

이후에 저 socket.receive(packet);

에서 블럭상태로 진행이 안됩니다.

감사합니다.

ifreeta (260 포인트) 님이 2013년 11월 7일 질문

1개의 답변

0 추천

 java.net.SocketException: Socket closed

receive 받기 전에 socket 을 먼저 close 시키는지 확인하세요

 

aucd29 (218,390 포인트) 님이 2013년 11월 7일 답변
서비스의 onDestroy()에서만 socket을 close하고 다른 부분에는 없습니다.
stopService()는 메인 액티비티의 onDestroy() 안에 있고요.
흠.................
...