일단 안드로이드 폰을 클라이언트로 잡고 자바를 서버로 잡았습니다.
이때 안드로이드폰에서 자바쪽으로접속까진 구현했는데
이제 서버에서 안드로이드폰으로 그림파일을 전송해주는 소스를 짯는데 계속 막혀서 .. 질문드립니다.
일단 소스는 총 3가지입니다.
<SERVER>
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ServerDB implements Runnable {
final int serverport = 11269;
private FileInputStream fis=null;
private OutputStream os=null;
private byte[] buffer = new byte[1024];
private File file = new File("ju.png");
private ServerSocket ss = null;
private Socket soc = null;
String client_sp = "/w";
public static void main(String[] args) {
Thread ServerTh = new Thread(new ServerDB());
ServerTh.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Server Ready....");
BufferedReader br;
PrintWriter pw;
try {
ss = new ServerSocket(serverport);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try{
soc = ss.accept();
while(true){
try{
// 클라이언트 접속 대기
System.out.println("접속자 = "+soc.toString());
String client_m;
String send_m;
br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
pw = new PrintWriter(soc.getOutputStream());
client_m = br.readLine();
String flen = String.valueOf(file.length());//파일의 크기를 받아온다
String header = "0000000000".substring(0, 10-flen.length()) + flen;
fis = new FileInputStream(file);
os = soc.getOutputStream();
System.out.println(file.getName()+" : "+fis.toString()+" : "+header);
os.write(header.getBytes()); // 파일들을 구분할 데이터를 먼저 전송한다.
os.flush();
while(fis.available() > 0){
int readSize = fis.read(buffer);
os.write(buffer, 0, readSize);
os.flush();
}
fis.close();
// os.close();
if(client_m.equals(client_sp)){
// 접속 요청을 하는 것이므로 DB값 보내주면 됨
send_m = DBInit();
pw.print(send_m);
pw.close();
}
} catch(IOException e){
e.printStackTrace();
}
MatrixTime(1000);
}
}catch(Exception e){
}
}
public static void MatrixTime(int delayTime){ // While문에 딜레이를 주기위한 함수
long saveTime = System.currentTimeMillis();
long currTime = 0;
while( currTime - saveTime < delayTime){
currTime = System.currentTimeMillis();
}
}
public String DBInit(){
Connection conn;
Statement stmt;
ResultSet rs = null;
String message = null;
String jdbcURL = "jdbc:mysql://localhost:3306/juchajang";
String userID = "root";
String userPass = "pc516";
try{
conn = DriverManager.getConnection(jdbcURL, userID, userPass);
try{
Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e){
e.printStackTrace();
System.err.println("erro1");
}
stmt = conn.createStatement();
System.out.println("Connection Success!");
stmt.execute("use juchajang");
rs = stmt.executeQuery("Select * from jucha;");
while(rs.next()){
System.out.print(rs.getString(1)+"\t");
System.out.print(rs.getString(2)+"\t");
System.out.print(rs.getString(3)+"\t");
System.out.print(rs.getString(4)+"\t"+"\n");
message = rs.getString(1) + "/" +
rs.getString(2) + "/" + rs.getString(3)+ "/" + rs.getString(4);
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException e){
e.printStackTrace();
}
return message;
}
}
<Client>
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
OpenDBHeloper oHelper;
EditText et1;
EditText et2;
EditText et3;
Button bt1;
Button bt2;
Button bt_server;
private TextView tv1;
private Socket clientSocket;
SQLiteDatabase db;
ContentValues row;
Cursor cursor;
ClientSocket clientsoc;
private final String serverip = "220.69.24.102";
private final int serverport = 11269;
private Handler mHandler = new Handler(); // Background 작업과 작업의 효율성을 위한 핸들러 생성
private Runnable r = new Runnable() {
public void run() {
// getFile();
// screenPlayer();
//Log.w("TEST", "TEST");
// imView.setImageBitmap(BitmapFactory.decodeFile(filename));
mHandler.postDelayed(r, 1000);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
oHelper = new OpenDBHeloper(this);
et1 = (EditText)findViewById(R.id.gps_name);
et2 = (EditText)findViewById(R.id.gps_x);
et3 = (EditText)findViewById(R.id.gps_y);
bt1 = (Button)findViewById(R.id.bt1);
bt2 = (Button)findViewById(R.id.bt2);
bt_server = (Button)findViewById(R.id.bt_server);
tv1 = (TextView)findViewById(R.id.tv_result);
// 저장하고 싶으면 주석처리 하고
data_init();
bt1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
db = oHelper.getWritableDatabase();
/*// insert 메서드로 삽입
row = new ContentValues();
row.put("gpsname", "namgu 1th store");
row.put("gpsx", "35112326");
row.put("gpsy", "126894836");
db.insert("gps1", null, row);*/
String gps_name = et1.getText().toString();
String gps_x = et2.getText().toString();
String gps_y = et3.getText().toString();
// sql 쿼리로 삽입
db.execSQL("insert into gps1 values ('"+ gps_name
+"', '"+ gps_x +"', '"+ gps_y +"') ");
oHelper.close();
display_read();
et1.setText("");
et2.setText("");
et3.setText("");
}
});
bt2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
display_read();
}
});
bt_server.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// Server 접속 처리
clientsoc = new ClientSocket(serverip, serverport);
clientSocket = clientsoc.getSocket();
mHandler.post(r);
}
});
//
}
public void data_init() {
// TODO Auto-generated method stub
db = oHelper.getWritableDatabase();
db.execSQL("DELETE FROM gps1;");
oHelper.close();
db.close();
}
public void display_read(){
tv1.setText("Result =" + "\n");
db = oHelper.getReadableDatabase();
cursor = db.rawQuery("SELECT gpsname, gpsx, gpsy FROM gps1", null);
String result = " ";
while(cursor.moveToNext()){
String gpsname = cursor.getString(0);
String gpsx = cursor.getString(1);
String gpsy = cursor.getString(2);
result += (gpsname + " | " + gpsx + " | " + gpsy + " | \n");
tv1.append(result);
}
cursor.close();
db.close();
}
}
<Socket Client>
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocket {
private Socket soc = null; // 소켓 객체 생성
// private InputStream is = null;
private FileOutputStream fos;
private InputStream is;
private String fileName = "getting.png";
private File file;
public ClientSocket(String ip, int port){
try {
soc = new Socket(ip, port);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter pw = null;
BufferedReader br = null;
try {
// 소켓에 out으로 출력
pw = new PrintWriter(soc.getOutputStream());
// 구분자로 /w
String outmessage = "/wHello";
pw.print(outmessage);
pw.close();
is = soc.getInputStream();
br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
String message;
while(true){
message = br.readLine();
System.out.println(message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void getFile(){
String filePath = android.os.Environment.getExternalStorageDirectory()+"/"+fileName;
file = new File(filePath);
if(!file.exists()){
try{
file.createNewFile();
}catch(IOException e){
}
}
try{
fos = new FileOutputStream(file);
is = soc.getInputStream();
System.out.println(is.toString()+" : "+is.available());
}catch(IOException e){
}
byte[] buffer = new byte[4096];
try{
is.read(buffer, 0, 10);
String header = new String(buffer, 0, 10);
int bodySize = Integer.valueOf(header);
int readSize = 0;
while(readSize>bodySize){
int rSize = is.read(buffer);
fos.write(buffer, 0, rSize);
readSize = readSize+rSize;
fos.flush();
}
}catch(IOException e){
}finally{
try{
fos.close();
// is.close();
}catch(IOException e){
}
}
}
public Socket getSocket(){
return soc;
}
public InputStream getInputStream(){
return is;
}
}
이세가지입니다. 그런데 오류결과를 뒤져보니 os.write(header.getBytes()); 이쪽에서 오류가나는데요;; 무엇이 문제인질모르겠습니다 소스코드상에서 오류는없는데.. 왜이러는지 모르겠습니다 ㅜ 첨부파일




오류가 나는 로그를 보여주세요. 그 로그에 답이 있을 겁니다.
소스를 보내더라도 이런식으로 보내봐야 답주는 사람이 천사입니다.
그리고 마지막 이미지 엑박인데 저만 그런가요?