2011-10-04 3 views
5

코드를 만들고 있는데 다른 Android 기기에 mp4 파일을 보내려고합니다. 나는 Wifi를 통해 Androids를 연결하고 1-20에서주기를 위해 간단한 것에서 쓰고 다른 Android 장치는 보내진 수를 읽고 표시하는 것을 도달했다.Android 기기간에 파일을 전송 하시겠습니까?

   InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       Socket socket = new Socket(serverAddr, port); 
       connected = true; 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 


         for (int i = 1; i < 20; i++) { 


          out.println(i); 

          i=i++; 

하고 "수신기":

는 여기가 "보낸 사람"의 흥미로운 부분입니다

serverSocket = new ServerSocket(SERVERPORT); 

         // listen for incoming clients 
         Socket client = serverSocket.accept(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()),8*1024); 

이 좋은 작품! 하지만 int 대신 하나의 장치에서 다른 장치로 파일을 보내려고합니다. 나는 이것을 어떻게 할 수 있는가 ?????

답변

1

데이터를 일종의 데이터 형식을 통해 스트림에 패키징해야합니다. 이렇게하는 한 가지 방법은 전자 메일에 첨부 파일을 보내는 데 일반적으로 사용되는 일반적인 MIME 데이터 형식을 사용하는 것입니다.

the following SO Question - android add filename to bytestream에서이 형식을 사용하여 소켓을 통해 바이너리를 보내는 것과 관련된 다른 질문에 답변했습니다. 그 질문에 대한 대답을 확인할 수 있습니다.

참고로 아래 질문에서 socket을 통해 보내고받는 코드를 복사했습니다.

File f = new File(path); 
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 
String filename=path.substring(path.lastIndexOf("/")+1); 

// create a multipart message 
MultipartEntity multipartContent = new MultipartEntity(); 

// send the file inputstream as data 
InputStreamBody isb = new InputStreamBody(new FileInputStream(f), "image/jpeg", filename); 

// add key value pair. The key "imageFile" is arbitrary 
multipartContent.addPart("imageFile", isb); 

multipartContent.writeTo(out); 
out.flush(); 
out.close(); 

JavaMail의 일부인 MimeBodyPart을 사용하여 아래 코드를 다시 읽는 코드입니다.


MimeMultipart multiPartMessage = new MimeMultipart(new DataSource() { 
    @Override 
    public String getContentType() { 
     // this could be anything need be, this is just my test case and illustration 
     return "image/jpeg"; 
    } 

    @Override 
    public InputStream getInputStream() throws IOException { 
     // socket is the socket that you get from Socket.accept() 
     BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream()); 
     return inputStream; 
    } 

    @Override 
    public String getName() { 
     return "socketDataSource"; 
    } 

    @Override 
    public OutputStream getOutputStream() throws IOException { 
     return socket.getOutputStream(); 
    } 
}); 

// get the first body of the multipart message 
BodyPart bodyPart = multiPartMessage.getBodyPart(0); 

// get the filename back from the message 
String filename = bodyPart.getFileName(); 

// get the inputstream back 
InputStream bodyInputStream = bodyPart.getInputStream(); 

// do what you need to do here.... 
+0

Nice !! 그래서 파일 이름 부분을 무시합니다. "multipartContent.addPart ("imageFile ", isb); "에 해당하는 항목은 무엇입니까? 다른 Android 휴대 전화에서 파일을 가져 오는 방법은 무엇입니까 ?? 왜냐하면 당신이 대답 한 대답은 JavaMail을위한 것입니까? 감사합니다. – Merol

+0

JavaMail은 MIME 형식 (MimeMultipart)에 대한 라이브러리를 포함하고 있기 때문에 방금 사용되었지만 메일과는 아무런 관련이 없습니다. 파일 이름은 기본적으로 상대방에게 전송하는 파일 이름의 메타 데이터입니다 (아무렇지도 않으면 아무것도 쓸 수 없습니다). "imageFile"은 데이터의 키일뿐입니다. 이름을 지정할 수 있습니다. 샘플로 만 존재했습니다. 이메일 첨부 파일에서 작동하는 것으로 입증되어 프로젝트에서 이진 파일을 전송해야하는 경우 동일한 패턴을 사용합니다. 내 데이터 형식을 고안하는 것보다 쉽습니다. – momo

0

당신이 그것을 살펴보고 장치를 연결하고 그들 사이의 파일 공유에 대한 일반적인 생각을 가질 수 있습니다 구글 발표 오픈 소스 프로젝트 있다.

다음은 링크입니다. android-fileshare

관련 문제