안녕하세요~ 연말이라 다들 바쁘시죠??

 

정말 정신없네요 ㅠㅠ 그래도 할건 해야하는데..!!

 

아직 해결못한 부분이 있어서 이렇게 질문글 올리게 되네요 ㅠ.ㅠ

 

부디 시간적 여유가 조금 있으시다면 이 초보녀석의 질문에 자문을 주신다면 정말 감사하겠습니다!

 

 

 

다름이아니라, 제가 요즘 안드로이드에서 자바서버로 파일을 보내려고 하는데요!

 

기본적인 구현은 구글링해서 소스를 찾고 저에게 맞춰서 해놓았습니다.

 

그런데.. 가장 처음 생긴 문제가 '전송은 되지만 제대로 전송되지 않는다' 였습니다..

 

그래서 일전에 질문글을 올렸는데.. 모두들 정말 성심을 다해 질문해주셔서 너무 감사했습니다!

 

하지만 저의 낮은 지식으론 그 고마운 답변으로도 혼자 해결하지 못하였습니다..ㅠ.ㅠ

 

수정한다고 해봤는데 솔직히 이게 맞는지도 잘 모르겠네요;

 

일단 전체 소스를 올려드리겠습니다!

 

 

 

자바 서버 : TCPServer.java

 

요녀석은 소켓통신으로 파일명과 파일을 받아오고, 그대로 출력 및 아웃풋 해주는 녀석입니다. 자바서버이구요!

 

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TCPServer implements Runnable{
public static final int serverPort = 30001;
@Override
public void run(){
       try{
       System.out.println("대기중..");
           ServerSocket serverSocket = new ServerSocket(serverPort);
              
           while(true)
           {
              Socket sock = serverSocket.accept();
              System.out.println("수신중....");
              try{
                  BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                 String str = in.readLine();
                 
                 System.out.println("수신중인 파일 이름 : " + str);
                 System.out.println("받아온 데이터 크기 : ");
                 
                 File f = new File("c:\\down\\", str+".jpg");
                 FileOutputStream output = new FileOutputStream(f);
                 
                 File[] files = f.listFiles();
                 long length = f.length();
                 
                 byte[] buf = new byte[5369]; 
                 
                 while(sock.getInputStream().read(buf)>0)
                 {
                    output.write(buf,0,5368);
                    output.flush();
                 }
                 in.close();
                 output.close();
                 System.out.println(str+".jpg 수신완료");
             }
             catch(Exception e){
                 System.out.println("서버 에러!!");
                 e.printStackTrace();
             }
             finally{
                 sock.close();
             }
           }
       }
       catch(Exception e){
           e.printStackTrace();
       }
}
public static void main(String[] argv){
Thread doit = new Thread(new TCPServer());
       doit.start();
}
}

 

 

 

 

 

 

 

 

MyThreadActivity.java

 

요녀석이 안드로이드입니다. SD카드에 있는 지정된이름의 파일을 찾아 보냅니다.

통신하는 부분 별표시 땋! 해놓았습니다!

 

 

 package org.tacademy.thread;
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;
 //TextHandler handler;
 Handler handler;
 private Socket socket; // 소켓 정의
 public static String ip=null;
 public static int port=0;
 
  EditText edit,edit_ip,edit_port;
 public static String msg;
 public static boolean Enable=false;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        edit = (EditText) findViewById (R.id.editText3); //아이디를 미리 지정
        edit_ip = (EditText) findViewById (R.id.editText1); //아이디를 미리 지정
        edit_port = (EditText) findViewById (R.id.editText2); //아이디를 미리 지정
        textView01 = (TextView) findViewById(R.id.text);
        
        Button button01 = (Button) findViewById(R.id.connect);
        button01.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
          if(Enable==false)
          {
          ip=edit_ip.getText().toString();
          port=Integer.parseInt(edit_port.getText().toString());
          connect();
          Enable=true;
          RequestThread rt = new RequestThread();
          rt.start();
          SendThread st = new SendThread();
          st.start();
          }
         }
        });
        
        textView01 = (TextView) findViewById(R.id.text);
        
        Button button02 = (Button) findViewById(R.id.exit);
        button02.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
          Enable=false;
          try {
           
     socket.close();
     Log.i("","소켓 닫음");
    } catch (IOException e) {
     e.printStackTrace();
    }
          
    Log.i("","무한루프 종료");
         }
        });
        
        
        
        Button button03 = (Button) findViewById(R.id.send);
        button03.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
          String str = edit.getText().toString();  //str에 에디트텍스트값 넣음
          try {
//파일전송 및 통신★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
  
 
 
 
             Log.i("로그","두번째이상 클릭");         //★★★★★★★로그켓
               str = edit.getText().toString(); //str변수에 에디트텍스트값 넣음
               PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(),"MS949")),true);
            out.println(str);
            Log.i("로그","보냄");         //★★★★★★★로그켓
            out.flush();
            File f = new File(new String(("/mnt/sdcard/1.jpg")));
            
            DataInputStream dis = new DataInputStream(new FileInputStream(new File("/mnt/sdcard/1.jpg")));
            long length = f.length();
                 DataOutputStream dos = new 
                      DataOutputStream(socket.getOutputStream());
                               byte[] buf = new byte[(int)length]; 
                           Log.i("로그",""+length);       //★★★★★★★로그켓
                               while(dis.read(buf)>0)
                               {
                            dos.write(buf,0,5370);
                          Log.i("로그","보냄");         //★★★★★★★로그켓
                               }
                               dos.flush();
                            dos.close();
                } catch (IOException e) {
                 // TODO Auto-generated catch block
                 Log.i("로그","두번째이상 클릭에서 오류");         //★★★★★★★로그켓
           }
         }
        });
        
        
        
        
        
        
        
        
        
        
        handler = new Handler();
    }
    
    
    public void connect(){
     if(Enable==true)
     {
  try { 
    socket = new Socket(ip, port);
         Log.i("로그","서버열림");         //★★★★★★★로그켓
         
  } catch(Exception ex) {
  }
        }
    }
    
    
    
    
    
    class SendThread extends Thread{
     public void run(){
      
      while(Enable==true)
      {
   try {
    Log.i("로그","버퍼라이터 정의");         //★★★★★★★로그켓
   BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "MS949" ));
   Log.i("로그","리드라인 시작");         //★★★★★★★로그켓
   //msg = br.readLine();  // 서버에서 올 메세지를 기다린다.
   msg = new String(br.readLine()); 
   Log.i("로그","리드라인 끝, 읽어온 버퍼:"+msg);         //★★★★★★★로그켓
   
   
   } catch(Exception ex) {
    Log.i("로그","리드라인 오류 또는 타임아웃");//★★★★★★★로그켓
    
    connect();
    Log.i("로그","소켓 재생성 완료");//★★★★★★★로그켓
       
          }
      }
      
     }
    }
    
    
    
    
    class RequestThread extends Thread {
     public void run() {
      while(Enable==true){
       
       
       
          try {
        Thread.sleep(100);
       } catch (InterruptedException e) {
        // TODO 자동 생성된 catch 블록
        e.printStackTrace();
       }
       
       
   
      
       
          if(msg!=null)
          {
       Log.i("로그","포스트 보냄");         //★★★★★★★로그켓
       handler.post(new TextRunnable(msg));
       msg=null;
          }
     }
     }
     
    }
    
    
    class TextRunnable implements Runnable {
     String mText;
     
     public TextRunnable(String text) {
      mText = text;
     }
     
     public void run() {
      Log.i("로그","핸들러-텍스트 바꿈 :"+mText);         //★★★★★★★로그켓
      Log.i("로그","현재 버퍼 :"+msg);         //★★★★★★★로그켓
   
      textView01.setText(mText);
     }
    }
    
}

 

이전 질문 이후로 수정한 부분은 write(buf) 라는 부분을 write(buf,0,(int)length)로 해놓은것입니다.

 

많은 답변의 내용으로는, 읽어오는 데이터 양을 지정하지 않아서 라고 들었습니다.

 

하지만 지식이 짧은 제가 해결하려고 어떻게 수정한 코드이긴 합니다만, 역시 벅차네요 ㅠㅠ

 

 

                                                                      

      원본 이미지                                                                                        전송 후 이미지

 

  

 

이렇게 나오는것이 지금으로서의 문제라고 할 수 있겠습니다..!

 

사실 지금 제 목적은 음성파일을 전송하는겁니다... 일단 확인이 쉬운 이미지로 하고있습죠! 

 

버퍼의 길이를 숫자로 정해서 움직이다보면 조금씩 이미지가 바뀌다가 제대로 나올때도 있는데요..

 

문제는 다른 이미지를 전송해버리면 파일크기가 달라서 또 깨진다는거~

 

 

 

설명을 듣자하니 그리 심오한 내용은 아닌 것 같은데 제가 많이 미숙해서 아직 잘 모릅니다 ㅠ.ㅠ

 

열심히 공부하고있으나 시간이 녹록치않네요... 프로젝트도 압축해서 첨부합니다. 도움 부탁드립니다!

profile

 

 

────────────────────── Android.Park

KOPS Co.,Ltd Technical R&D Center / Researcher
───────────────────────────────