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

라즈베리파이 파이썬과 안드로이드스튜디오 자바 소켓프로그래밍 질문입니다! [closed]

0 추천
import socketserver

from os.path import exists

import time

import picamera
  

HOST = '1.1.1.1'

PORT = 9999

 

class MyTcpHandler(socketserver.BaseRequestHandler):

    def handle(self):

        print('[%s] 연결됨' %self.client_address[0])
        
        while True:

            message = self.request.recv(1024) # 클라이언트로 부터 파일이름을 전달받음

            message = str(message,encoding='utf-8').rstrip('\n')
            #decode('utf-8').strip('\n')
            
            
            if message == 'image':
                
                data_transferred = 0
                
                filename = self.request.recv(1024)
                
                filename = str(filename,encoding='utf-8').rstrip('\n')
                
                with picamera.PiCamera() as camera:
                    camera.start_preview()
                    time.sleep(1)
                    camera.capture('/home/pi/%s'%filename)
                    camera.stop_preview()
                
                if not exists(filename): # 파일이 해당 디렉터리에 존재하지 않으면

                    self.request.send('파일이름이 존재하지않습니다')

                print('파일[%s] 전송 시작...' %filename)

                with open(filename, 'rb') as f:
                    
                    try:

                        data = f.read(1024) # 파일을 1024바이트 읽음
                        
                        while data: # 파일이 빈 문자열일때까지 반복
                            
                            data_transferred += self.request.send(data)

                            data = f.read(1024)

                        

                    except Exception as e:
  
                        print(e)

     

                print('전송완료[%s], 전송량[%d]' %(filename,data_transferred))

            else:
                print('[client]'+message)
                
 
    
 

def runServer():

    print('++++++파일 서버를 시작++++++')

    print("+++파일 서버를 끝내려면 'Ctrl + C'를 누르세요.")

 

    try:

        server = socketserver.TCPServer((HOST,PORT),MyTcpHandler)

        server.serve_forever()

    except KeyboardInterrupt:

        print('++++++파일 서버를 종료합니다.++++++')

 

 

runServer()

위쪽이 라즈베리 파이에 들어가는 서버코드입니다.

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    String IP = "1.1.1.1"; int PORT = 9999;
    TextView text; EditText name; ImageButton btn;
    Socket socket;
    BufferedReader reader;
    PrintWriter writer;
    String filename;
    FileOutputStream output;
    String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();
    File f;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.text);
        name = (EditText) findViewById(R.id.name);
        btn = (ImageButton) findViewById(R.id.btnCam);

        Thread socket = new Thread(new TCPServer());
        socket.start();


    }

    public class TCPServer implements Runnable {

        @Override
        public void run() {

            try {
                socket = new Socket(IP,PORT);
                name.setText("연결완료");
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                writer = new PrintWriter(socket.getOutputStream(),true);

                writer.println("image");

                filename = "111.png";

                writer.println(filename);

                name.setText("파일요청");

                f = new File(filename);
                name.setText("1");

                output = new FileOutputStream(sdcard+"/"+f,false);

                name.setText("파일생성완료");

                byte[] buf = new byte[1024];
                while (socket.getInputStream().read(buf) > 0) {

                    output.write(buf);

                }

                output.close();

                name.setText("수신완료");

            } catch (Exception e) {
                //text.setText("서버에러");
                e.printStackTrace();
            }
        }
    }
}

안드로이드 스튜디오 자바 코드입니다

 

질문내용은 이미 라즈베리파이 파이썬 서버와 PC파이썬 클라이언트로 이미지를 전송받는걸 확인했는데

자바코드로 넘어가서

name.setText("1");

output = new FileOutputStream(sdcard+"/"+f,false);

1 은 화면에 출력되는데 아래 파일이 생성이 안된건지 경로가 잘못된건지

AVD사용하는 중인데 받아오질 못합니다.

질문을 종료한 이유: 해결
안드너무어려워 (140 포인트) 님이 2019년 4월 8일 질문
안드너무어려워님이 2019년 4월 15일 closed
...