이전에 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);
}
}