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

파이썬 서버 - 안드로이드 클라이언트 TCP 소켓 통신 구현 중 서버로부터 응답을 받지 못하는 문제를 겪고 있습니다.

0 추천

안녕하세요. 현재 안드로이드 클라이언트와 서버 사이의 TCP 소켓 통신을 구현하고 있습니다.

안드로이드 클라이언트에서 파이썬 서버로 이미지 파일을 전송하면 서버가 응답으로 문자열을 보내게 하고 싶은데, 문제가 발생했습니다.

안드로이드 클라이언트에서 이미지를 보내면 서버가 이미지를 끝까지 받지 못하다가 강제로 소켓 연결을 종료해야 이미지를 끝까지 받습니다.

그러다보니까 서버에서 응답으로 문자열을 보내도 안드로이드 앱은 그 응답을 받지 못하고 있습니다. 아무리 인터넷을 찾아보고 고민해봐도 어떻게 해결해야 할지 모르겠어서 조언을 구하려고 합니다ㅠㅠ

 

아래는 파이썬 서버의 소스코드입니다.

from socket import *
import sys

HOST = ''
PORT = 16161
BUFSIZE = 1048576
ADDR = (HOST, PORT)
CLIENT_NUM = 5

# 소켓 생성
serverSocket = socket(AF_INET, SOCK_STREAM)

# 소켓 주소 정보 할당
serverSocket.bind(ADDR)
print('bind')

# 연결 수신 대기 상태
serverSocket.listen(CLIENT_NUM)
print('listen')

while True:
    print('waiting...')
    try:
        # 연결 수락
        connectionSocket, addr_info = serverSocket.accept()
        print('accept')
        print('--client information--')
        print(connectionSocket)

        # 클라이언트로부터 파일을 가져옴
        img = open("./img.jpg", 'wb')
        while True:
            img_data = connectionSocket.recv(BUFSIZE)
            data = img_data
            if img_data:
                while img_data:
                    print("receiving Img...")
                    img_data = connectionSocket.recv(BUFSIZE)
                    data += img_data
                else:
                    break
        print("finish img recv")
        img.write(data)
        img.close()

        connectionSocket.send("OK\n".encode())
        connectionSocket.shutdown(SHUT_RDWR)
        connectionSocket.close()
        print('connection closed')

    except KeyboardInterrupt:
        sys.exit(0)

 

그리고 아래는 안드로이드 클라이언트의 소켓 프로그래밍 부분입니다.

public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIp);
            socket = new Socket(serverAddr, serverPort);
            try {
                dataOutput = new DataOutputStream(socket.getOutputStream());
                dataInput = new DataInputStream(new FileInputStream(img));

                byte[] buf = new byte[BUF_SIZE];
                int dataLen;
                while ((dataLen = dataInput.read(buf)) != -1) {
                    dataOutput.write(buf, 0, dataLen);
                    dataOutput.flush();
                }
                byte[] byteArr = new byte[1024];
                InputStream is = socket.getInputStream();
                int readByteCount = is.read(byteArr);
                String data = new String(byteArr, 0, readByteCount, "UTF-8");
                is.close();
                dataInput.close();
                dataOutput.close();
                socket.close();
            } catch (Exception e) {
                StringWriter sw = new StringWriter();
                e.printStackTrace(new PrintWriter(sw));
                String exceptionAsString = sw.toString();
                Log.e("StackTrace", exceptionAsString);
            } 
        } catch (IOException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            Log.e("StackTrace", exceptionAsString);
        }

    }

 

감사합니다.

쩡쓰 (120 포인트) 님이 2019년 2월 17일 질문

답변 달기

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