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

안드로이드 > 자바 파일전송간 문제입니다.

0 추천

이전에 12년도에 올라온 이미지 파일 전송 코드를 보고 수정을 하려 하는데 굉장히 어렵네요

목적은 (스마트폰에 저장된 텍스트파일) >> (PC의 자바 서버 내 지정 위치) 로 전송하는 건데요 

바탕화면으로 위치를 지정하고 전송하려 했으나 파일만 만들어지고 안의 내용은 빈 파일이네요

이미지와 텍스트 파일의 경우는 또 다른 것인지 .. 아래 코드 첨부하겠습니다.

안드로이드 쪽 코드입니다.

package kr.soen.mythreadactivity;


import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.io.BufferedWriter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MyThreadActivity extends Activity {
    TextView textView01;
    Handler handler;
    private Socket socket; // 소켓 정의
    public static String ip = "localhost";
    public static int port = 30001;
    EditText edit, edit_ip, edit_port;
    public static String msg;
    public static boolean Enable = false; // 초기값은 false 이다. ##########################################

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        edit_ip = (EditText) findViewById(R.id.editText1); // ip 가 들어감
        edit_port = (EditText) findViewById(R.id.editText2); // port 가 들어감
        edit = (EditText) findViewById(R.id.editText3); // 보낼 메시지가 들어감
        textView01 = (TextView) findViewById(R.id.text); // test 라는 문구가 있음
        Log.i("dsem_log", "oncreate start");
        Button button01 = (Button) findViewById(R.id.connect); // 버튼 1은 커넥트라는 이름을 가진 버튼

        button01.setOnClickListener(new OnClickListener() { // 버튼 1을 누르면
            public void onClick(View v) { // 시행
                Log.i("dsem_log", "connect button clicked");
                if (Enable == false) { // false 일때
                    ip = edit_ip.getText().toString(); //ip 는 edit ip 에서 적혀있는 스트링형 텍스트이다
                    Log.i("dsem_log", ip);
                    port = Integer.parseInt(edit_port.getText().toString()); // 포트는 edit port 에 적혀있는 스트링 값이면 인트형으로 변환해서 가져온다.
                    Log.i("dsem_log", String.valueOf(port));
                    connect(); // 커넥트 함수를 시행한다
                    Enable = true; // 트루로 바꿔준다
                    RequestThread rt = new RequestThread(); // 리퀘스트 스레드를 선언
                    rt.start(); // 시행
                    SendThread st = new SendThread(); // 샌드 스레드를 선언
                    st.start(); // 시행
                }
            }
        });
        textView01 = (TextView) findViewById(R.id.text); // test라는 문구가 있음
        Button button02 = (Button) findViewById(R.id.exit); // exit 라는 이름을 가진 버튼 2이다
        button02.setOnClickListener(new OnClickListener() { // 버튼 2를 누르면
            public void onClick(View v) {  // 시행
                Enable = false;  // false로 바꿔준다.
                try {
                    socket.close(); // 소켓을 닫아준다
                    Log.i("dsem_log", "소켓 닫음");
                } catch (IOException e) {
                    e.printStackTrace(); //에러 확인
                }
                Log.i("dsem_log", "무한루프 종료");
            }
        });

        Button button03 = (Button) findViewById(R.id.send); // 버튼 3은 send 라는 이름을 가진 버튼이다
        button03.setOnClickListener(new OnClickListener() { //누르면
            public void onClick(View v) {  // 시행
                String str = edit.getText().toString();  //스트링 변수 str에 3번째 줄에 적인 문구를 넣음
                try {
                    Log.i("dsem_log", "두번째이상 클릭");
                    str = edit.getText().toString(); //str변수에 에디트텍스트값 넣음
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "MS949")), true); // 문자 인코딩 부문 ms949를 사용한다.
                    out.println(str); // str에 들어가 인코딩 된 값을 출력해 준다.
                    Log.i("dsem_log", "보냄");
                    out.flush(); // flush를 통해 보내준다
                    File f = new File("/storage/A212-21FF/11111.txt"); // 파일을 생성해준다 파일 주소명을 써준다. "/storage/A212-21FF/11111.txt"
                    Log.i("dsem_log", "파일생성함");
                    DataInputStream dis = new DataInputStream(new FileInputStream(f)); //inputStream is = new inputStream(new
                    Log.i("dsem_log", "파일길이 사이");
                    long length = f.length();  //long 형 변수 length를 정의해 파일주소 길이를 잰다
                    Log.i("dsem_log", "파일길이 재고");
                    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                    byte[] buf = new byte[(int) length];
                    Log.i("dsem_log", "실행");
                    Log.i("dsem_log", "" + length);
                    while (dis.read(buf) > 0) {
                        dos.write(buf, 0, 9999);
                        Log.i("dsem_log", "보냄");
                    }
                    dos.flush();
                    dos.close();
                } catch (IOException e) {
                    Log.i("dsem_log", "두번째이상 클릭에서 오류");
                }
            }
        });
        handler = new Handler();

    }
    public void connect() {
        Log.i("dsem_log", String.valueOf(Enable));
        if (Enable==true)
        {
            try {
                socket = new Socket(ip,port);
                Log.i("dsem_log", "서버열림");
            } catch (Exception ex) {
                Log.e("dsem_log", ex.getMessage());
            }
        }
    }
    class SendThread extends Thread {
        public void run() {
            while (Enable==true) {
                try {
                    Log.i("dsem_log", "버퍼라이터 정의");
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "MS949"));
                    Log.i("dsem_log", "리드라인 시작"); //msg = br.readLine();  // 서버에서 올 메세지를 기다린다.
                    msg = new String(br.readLine());
                    Log.i("dsem_log", "리드라인 끝, 읽어온 버퍼:" + msg);
                } catch (Exception ex) {
                    Log.i("dsem_log", "리드라인 오류 또는 타임아웃");
                    connect();
                    Log.i("dsem_log", "소켓 재생성 완료");
                }
            }
        }
    }


    class RequestThread extends Thread {
        public void run() {
            while (Enable==true) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (msg != null)           {
                    Log.i("dsem_log", "포스트 보냄");
                    handler.post(new TextRunnable(msg));
                    msg = null;
                }
            }
        }
    }


    class TextRunnable implements Runnable {
        String mText;
        public TextRunnable(String text) {
            mText = text;
        }
        public void run() {
            Log.i("dsem_log", "핸들러-텍스트 바꿈 :" + mText);
            Log.i("dsem_log", "현재 버퍼 :" + msg);
            textView01.setText(mText);
        }
    }

익명사용자 님이 2018년 1월 11일 질문
올려주신 소스에서는 서버로 파일을 보내는 것이 아니라 텍스트만 전송하는 것처럼 보여지는데,  원하는 소스를 참고하고 계신 것이 맞나요?
현재 코드내에서는 텍스트만을 전송하고 있다는 건가요 서버에서는 파일을 새로 만들어주고 전송받은 텍스트를 쓰는거로 알고 있습니다. 혹시 참고할 만한 다른 예제가 있을까요?
질문내용에서는 [...목적은 (스마트폰에 저장된 텍스트파일) >> (PC의 자바 서버 내 지정 위치)...] 라고 말씀해주셨는데, 서버에서 파일 만들고 전송받은 텍스트를 저장하고 있는거면, 파일이 빈파일로 되는건 서버쪽 소스도 봐야 어느 부분에서 문제가 있는지 판단이 가능해 보입니다.

답변 달기

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