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

안드로이드와 라즈베리파이 간 소켓 통신 중 Broken Pipe Error 질문 있습니다.

0 추천

안드로이드(클라이언트)  <-> 라즈베리파이(서버) 간 통신을 구현하고 있습니다.

서버는 파이썬을 사용중이구요

클라이언트에서 서버로 메시지 전달은 잘 되는데 역으로 보낼때마다 에러가 발생합니다.

클라이언트 측

       btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setRunningState(true);
                (new Connect()).start();
            }
        });
    }
    class Connect extends Thread {
        public void run() {
            Log.d("Connect", "Run Connect");
            String ip = null;
            int port = 0;

            try {
                ip = "175.116.88.177";
                port = 1999;
                sock = new Socket(ip, port);
                outstream   = new DataOutputStream(sock.getOutputStream()); //출력 Stream
                instream = new DataInputStream(sock.getInputStream());      //입력 Stream

                mHandler.post(new Runnable() {// Thread에서 UI 변경시 Handler 이용
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        setToast("연결에 성공하였습니다.");
                    }
                });
                System.out.println("Connected!!");
                (new recvSocket()).start(); // 소켓 연결 후 데이터를 받는 쓰레드를 실행하여 데이터 받을 준비
            } catch (Exception e) {
                final String recvInput = "연결에 실패하였습니다.";
                Log.d("Connect", e.getMessage());
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        setToast(recvInput);
                    }
                });
            }
        }
    }
    class recvSocket extends Thread {
        public void run() {
            try {
                instream = new DataInputStream(sock.getInputStream());

                while (true) {
                    byte[] b = new byte[100];
                    int ac = instream.read(b, 0, b.length);
                    String input = new String(b, 0, b.length);
                    final String recvInput = input.trim();

                    if(ac==-1)  //파이썬 측에서 Broken Pipe Error 발생으로 메시지가 전달되지 않아 ac 값이 -1이 나오는 것 같다
                        break;

                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            setToast(recvInput);
                        }
                    });
                }
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        setToast("연결이 종료되었습니다.");
                    }
                });
            } catch (Exception e) {
                final String recvInput = "연결에 문제가 발생하여 종료되었습니다..";
                Log.d("SetServer", e.getMessage());
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        setToast(recvInput);
                    }
                });
            }
        }
    }

서버 측

s = socket(AF_INET, SOCK_STREAM)
    
s.bind(ADDR)
s.listen(1)

client, conn = s.accept()
print "Connected From", conn
    
def connection():
    
    #b.sendto(conn[0],conn)
    #RTS()

    while True:
        data = client.recv(1024)
        #print len(data)
        if len(data) > 0:
            print 'recieved msg : ', data
            s.send(data)
            value = int(data)
            slave.set_values(block, 30, value)
            value = str(slave.get_values(block,30,1))
        
    s.close()
    client.close()
        

서버측은 위 함수가 쓰레드로 돌고 있습니다.

에러 내용

 

Exception in thread Thread-2:

Traceback (most recent call last):

  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner

    self.run()

  File "/usr/lib/python2.7/threading.py", line 763, in run

    self.__target(*self.__args, **self.__kwargs)

  File "/home/pi/modbus_tk_main.py", line 40, in connection

    s.send(data)

error: [Errno 32] Broken pipe

추가> Broken pipe 익셉션은 소켓 연결이 유지가 되지 않아 생기는 것이라고 본것 같은데

클라이언트 측에서 보내기만 할땐 잘 되는데

데이터를 받아서 그 내용 그대로 돌려주기를 해도 되질 않으니 갑갑해 죽겠습니다.

고수님들 도와주세요.ㅠㅠ

마그마커피 (120 포인트) 님이 2016년 1월 6일 질문
마그마커피님이 2016년 1월 6일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...