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

at android.os.strictmode$androidblockguardpolicy.onnetwork 오류가 발생합니다

0 추천
안녕하세요 안드로이드로 개발시작한지 얼마 안되는 뉴비입니다

 

udp 를 이용해서 채팅 프로그램을 짜고 있습니다

 

제가 구한 예제를 보니 먼저 받아서 그 패킷에서 송신자 ip/포트 번호 구하던데요

 

getbyname 이란 함수 이용해서 제가 ip와 서버를 주고 해서 프로그램을 시작했습니다

 

근데 제가 먼저 받고 전송을 하니 데이터가 잘 날아가는데요

 

데이터를 먼저 안받고 데이터 전송을 하려니까 에러가 나더군요

 

at android.os.strictmode$androidblockguardpolicy.onnetwork 이 에러가 나던데요

 

찾아보니 통신 관련 내용은 메인 액티비티에서 할수 없고 스레드로 만들라는 내용이던데요

 

그래서 제가 chatting Mychat = new Mychat() 이런식으로 만들었습니다

 

그런데 문제가 되는데 저 chatting 클래스 안에 send 명령이 있는데 그 send 명령에 그냥 접근하니

 

위에 저 오류가 납니다 어떻게 send 명령에 접근해야 할까요
갈로 (690 포인트) 님이 2013년 12월 18일 질문

2개의 답변

+1 추천
 
채택된 답변
send명령어내에 쓰레드생성 부분이 있나요?

없다면 send명령어를 쓰레드 생성하여 쓰레드 내에서 호출하면 되지않을까싶은데

UI작업을 포함하고 있으면 또 문제가 될수도 있구요.;

결론적으로 네트워크작업은 다른쓰레드에서 UI작업은 메인쓰레드에서 작업하도록 구현하셔야 합니다.

다른쓰레드에서 네트워크작업을하다가 네트워크 작업이 끝나면 핸들러 호출해서 핸들러에서 UI작업을 한다던가 이런식으로 말이죠.
얼룩돼지 (15,720 포인트) 님이 2013년 12월 18일 답변
갈로님이 2013년 12월 19일 채택됨
안녕하세요 답글 주셔서 감사합니다

하나 더 여쭈어 보려고 댓글 남깁니다

제가 액티비티에

    Thread udp_comm = new Thread()
    {
        public void run()
        {
            udp_s = new udp_server(myact);
            udp_s.run();
        }
    };

이런식으로 선언하고

onCreate() 안에는

        new Thread ()
        {
            public void run()
            {
                udp_comm.start();
            }
        }.run();

이런식으로 선언했습니다

그런데도 저 경고문이 뜨던데요

제가 한 방법이 쓰레드를 이용해서 udp_server 를 만든게 아닌가요?
적어주신 소스만으로 판단하기는 애매하나
왜 두개로 나눴는지 모르겟네요.
udp_comm를 Activity클래스의 맴버변수로 만들어서 onCreate에서 start만 해주시면 될거같은데
쓰레드 객체를 스타트할때 다시 쓰레드를만들어서 그안에서 스타트할 필요는 없어요.
그렇군요 감사합니다 말씀하신대로 클래스를 내부 클래스로 변경하였습니다
onCreate() 안에
        udp_s = new _udp_server();
       
        new Thread()
        {
            public void run()
            {
                StrictMode.enableDefaults();
                udp_s.start();
            }
        }.start();

데이터 수신쪽은 이렇게 했습니다
public void run() {   
        // TODO Auto-generated method stub
        
        //ma.notice.setText("Server start");
        StrictMode.enableDefaults();

        try {   
            Bundle b = new Bundle();

            /* Retrieve the ServerName */  
            InetAddress serverAddr = InetAddress.getByName(SERVERIP);   
   
            Log.d("UDP", "S: Connecting...");   
            /* Create new UDP-Socket */  
            socket = new DatagramSocket(SERVERPORT, serverAddr);
            Log.d("SOCKET : " ,socket.toString());

            /* By magic we know, how much data will be waiting for us */  
            byte[] buf = new byte[17];   
            /* Prepare a UDP-Packet that can  
             * contain the data we want to receive */  
            packet = new DatagramPacket(buf, buf.length);   
            Log.d("UDP", "S: Receiving...");   
   
                   while(true)
                   {
                    /* Receive the UDP-Packet */
                    Log.d("UDP", "UDP Recv Start");
                    socket.receive(packet);
               
                    //ma.notice.setText(socket.getLocalAddress().toString() + ":"+ socket.getPort());
                    b.putString("data", (String)socket.getLocalAddress().toString());
                    Log.d("UDP", "S: Received: '" + new String(packet.getData()) + "'");   
                       Log.d("UDP", "S: Done.");
            
                    //clientAddr = packet.getAddress();
                    clientAddr = InetAddress.getByName("192.168.43.58");
                    //clientAddr = InetAddress.getByName("192.168.11.5");   
                    clientPort=8080;
                    //int clientPort = packet.getPort();
                    //clientPort = packet.getPort();
                    Log.d("UDP", "S:Address '"+new String(packet.getAddress().toString())+"'");
                    Log.d("UDP", "S:Port: '"+packet.getPort()+"'");
                    //String s = "Thanks";
                       String s = "029903\r";
                    buf = s.getBytes();   
                    packet = new DatagramPacket(buf, buf.length, clientAddr, clientPort);
            
                    Log.d("UDP", "S: Sending: '" + new String(buf) + "'");   
                    socket.send(packet);
                  }          
            }
            catch (Exception e)
            {   
                Log.e("UDP", "S: Error", e);
            }
    }

송신쪽은 이렇게 했습니다

public void SendData(String data)
    {
            /* By magic we know, how much data will be waiting for us */  
            //byte[] buf = new byte[17];   
            /* Prepare a UDP-Packet that can  
             * contain the data we want to receive */
             StrictMode.enableDefaults();
            try
            {
                Log.d("SOCKET : " ,socket.toString());
                clientAddr = InetAddress.getByName("192.168.43.58");
                //clientAddr = InetAddress.getByName("192.168.11.5");   
                clientPort=8080;
                packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getByName("192.168.43.58"), 8080);
                Log.d("UDP", "S: Sending: '" + data + "'");
            
                socket.send(packet);
            }
            catch(Exception e)
            {
                Log.d("Send: ", e.getMessage());
                e.printStackTrace();
            }
    }

이렇게 넣었습니다
버튼을 누르면 클래스 안에 send() 가 실행되게 해놨구요

근데 해보니까 먼저 데이터를 받으면 송신이 되는데

수신 없이 송신 하려니 데이터 송신이 안되네요

혹시 얼룩돼지님 보시기에는 제가 뭘 실수 했는지 보이시는지요
0 추천
말그대로 새로 쓰레드를 하나 만들어서 띄우셔서 채팅 통신을 하시면 될것 같습니다.

 

그럼 수고 하세요.
철수야안녕 (6,120 포인트) 님이 2013년 12월 18일 답변
...