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사용하는 중인데 받아오질 못합니다.