JavaServer 에서 Android 로 여러개의 파일을 전송을 하고 싶어서
코딩을하고 있습니다. 하지만 파일은 전송되지만 한가지 문제가 발생하는데
에러는 나지 않고 정상적으로 소켓통신은 작동하지만
JavaServer에서 보내고자하는 파일 sample1.txt(674kb) , sample2.txt(1300kb)를 전송하면
Android Client에서는 sample1.txt(1974kb), sample2.txt(0kb) 이런식으로 하나의 파일에
모든 값이 저장됩니다. 소스에서 어디가 문제인지 잘 이해가 되지 않습니다...
JavaServer 소스입니다.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
public class MultifileTransferServer {
public ServerSocket serv;
public Socket sock;
BufferedInputStream bis = null;
DataInputStream dis = null;
DataOutputStream dos = null;
ArrayList<String> fileNames = new ArrayList<String>();
ArrayList<File> files = new ArrayList<File>();
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
System.out.println(InetAddress.getLocalHost().getHostAddress());
}catch(UnknownHostException e)
{
e.printStackTrace();
}
MultifileTransferServer server = new MultifileTransferServer(5000);
}
public MultifileTransferServer(int port)
{
try
{
fileNames.add("sample1.txt");
fileNames.add("sample2.txt");
for(String fileName : fileNames)
{
files.add(new File("D:/TestTest/"+fileName));
}
this.serv = new ServerSocket(port);
System.out.println("Server Started...~~");
while(true)
{
this.sock = this.serv.accept();
try
{
System.out.println("Client Accept....!!");
dis = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
dos = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
dos.writeInt(fileNames.size());
int readSize = 0;
int n = 0;
byte[]buf = new byte[4092];
byte[] done = new byte[3];
String str = " ";
done = str.getBytes();
for(int i=0;i<fileNames.size();i++)
{
System.out.println("Start File Trans "+ i);
FileInputStream fis = new FileInputStream(files.get(i));
while((n =fis.read(buf)) != -1){
dos.write(buf,0,n);
System.out.println(n);
dos.flush();
}
dos.write(done,0,3);
dos.flush();
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
try
{
if(bis != null) bis.close();
if(dos != null) dos.close();
if(dis != null) dis.close();
}
catch (Exception e2)
{
// TODO: handle exception
e2.printStackTrace();
}
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
Android Client 소스입니다.
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String testDir = getApplicationContext().getCacheDir().toString();
new Thread()
{
public void run()
{
String ServerIP = "192.168.0.10";
int port = 5000;
SocketConnect(ServerIP,port);
}
}.start();
}
public void SocketConnect(String ServerIP, int port)
{
try
{
Socket connection = new Socket(ServerIP, port);
MultiFileTransferClient.Client(connection);
}catch(IOException e)
{
e.printStackTrace();
}
}
}
import android.os.Environment;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Writer;
import java.net.Socket;
public class MultiFileTransferClient {
public static void Client(Socket sock)
{
BufferedOutputStream bos = null;
ObjectOutputStream oos = null;
DataInputStream dis = null;
DataOutputStream dos = null;
int fileTransferCount = 0;
long fileTransferSize = 0;
int readBufLength = 0;
File copyFile = null;
String[] TestFileName = new String[2];
TestFileName[0] = "sample1.txt";
TestFileName[1] = "sample2.txt";
try {
dis = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
dos = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();
try
{
fileTransferCount = dis.readInt();
int n = 0;
byte[]buf = new byte[4092];
for(int i=0; i< fileTransferCount ;i++)
{
Log.d("Test","Receiveing file : " + TestFileName[i]);
copyFile = new File(TestFileName[i]);
FileOutputStream fos = new FileOutputStream(sdcard+"/"+copyFile,false);
while((n = dis.read(buf)) != -1 && n!=3 ){
fos.write(buf,0,n);
fos.flush();
}
fos.close();
}
}
catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}finally
{
try
{
if(dis != null) dis.close();
if(dos != null) dos.close();
if(sock != null) sock.close();
}
catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
}
}
그리고 혹시 반대로 Android Client 에서 JavaServer로 파일을 전송할떄도 위의 소스를 이용해도
되는건가요?