앱 기능은 파일 위치 경로를 찾아 파일 읽기 이후 내용 읽어 서버로 보내기 입니다.
package com.example.t1.unknown;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Unknown extends AppCompatActivity {
TextView textView01;
Handler handler;
private Socket socket; // 소켓 정의
public static String ip = "203.234.62.113";
public static int port = 30001;
EditText edit, edit2, edit_ip, edit_port;
public static String msg;
String mRoot;
public static boolean Enable = false; // 초기값은 false 이다. ##########################################
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.unknown);
edit_ip = (EditText) findViewById(R.id.editText1); // ip 가 들어감
edit_port = (EditText) findViewById(R.id.editText2); // port 가 들어감
edit = (EditText) findViewById(R.id.editText3); // 파일 이름이 들어감
edit2 = (EditText) findViewById(R.id.editText4); // 파일 디렉토리가 들어감
textView01 = (TextView) findViewById(R.id.text); // test 라는 문구가 있음
Log.i("dsem_log", "oncreate start");
Button button01 = (Button) findViewById(R.id.connect); // 버튼 1은 커넥트라는 이름을 가진 버튼
button01.setOnClickListener(new View.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 View.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 View.OnClickListener() { //누르면
public void onClick(View v) { // 시행
String str = edit.getText().toString(); //스트링 변수 str에 3번째 줄에 적인 문구를 넣음
String Filedata;
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에 들어가 인코딩 된 값을 출력해 준다.
out.flush(); // flush를 통해 보내준다
mRoot = Environment.getExternalStorageDirectory().getAbsolutePath(); // mroot 에 루트 경로를 준다
File file = new File(mRoot+"/"+str);
FileReader fr = null;
BufferedReader in = null;
PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "MS949")), true); // 문자 인코딩 부문 ms949를 사용한다.
Log.i("dsem_log", "두번째이상 클릭");
int c;
try {
Log.i("dsem_log", "두번째이상 클릭");
fr = new FileReader(file);
in = new BufferedReader(fr);
while ((c = in.read()) != -1) {
out2.write((char)c);
out2.println(c);
Log.i("dsem_log", "c");
out2.flush();
Log.i("dsem_log", "두번째이상 클릭");
}
in.close();
fr.close();
out.close();
out2.close();
} catch (IOException e) {
}
} catch (IOException e) {
Log.i("dsem_log", "에러 10");
}
}
});
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);
}
}
}
아래 코드에서 문제는
1. 파일 위치 확인이 안됩니다. 상수값이 아닌 앱솔루트 루트로 했는데..
2. 파일 위치가 확인이 안되니 내용 전송이 안됩니다.