뭐가 문제 인지 모르겠습니다...;;
그냥 String 전송은 잘되는데
사진을.. 이제 보내려고 하니깐... 잘못 되었나 봅니다. ㅠㅠ
아마... 데이터 스트림을 다루는데에.. 익숙치 않아서..
윈도
-java 기반의 서버 입니다.
package mytest;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
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.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer implements Runnable {
public static final int ServerPort = 5557; // ex: 5555
public static String str = null;
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 서버 열린 것을 출력..
// System.out.println("S: Connecting...");
WindServer.resultArea.append("S: Connecting...\n");
// 소켓 생성..
ServerSocket serverSocket = new ServerSocket(ServerPort);
while (true) {
Socket client = serverSocket.accept();
// System.out.println("S: Receiving...");
WindServer.resultArea.append("S: Receiving...\n");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream(),
"euc-kr"));
str = in.readLine();
// 출력..콘솔*****************************************
WindServer.resultArea
.append("S: Received: '" + str + "'\n");
// ****************************************************
// ppt 동작***********************************
if (str.length() > 4) {
if (str.substring(0, 4).equals("pbtn"))
PptFunc(str);
else
keyFunc(str);
} else {
keyFunc(str);
}
// *******************************************
// 그러니깐.. pbtn_Cap 이 오면.. 저장된 사진 파일을 보내는 것입니다.
// *****************원래 단순하게 보내는 것*******
if (str.equals("pbtn_Cap")) {
PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
client.getOutputStream())), true);
out.flush();
DataInputStream dis = new DataInputStream(
new FileInputStream(new File(
"c://cap/capture.jpg")));
DataOutputStream dos = new DataOutputStream(
client.getOutputStream());
byte[] buf = new byte[1024];
while (dis.read(buf) > 0) {
dos.write(buf); // 이곳이 83번째 라인입니다.
dos.flush();
}
dos.close();
}
else {
PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
client.getOutputStream())), true);
out.println("Server Received " + str);
}
// 파일 전송..//
WindServer.resultArea.append("Server Received " + str
+ "\n");
} catch (Exception e) {
// System.out.println("S: Error");
WindServer.resultArea.append("S: Error" + "\n");
e.printStackTrace();
} finally {
client.close();
// System.out.println("S: Done.");
WindServer.resultArea.append("S: Done." + "\n");
}
}
} catch (Exception e) {
// System.out.println("S: Error");
WindServer.resultArea.append("S: Error- after Socket" + "\n");
e.printStackTrace();
}
}
여기 까지가 일단 서버 이고..
android ....... 뭐... 어떻게 말하면 클라이언트지만.. 사진은 받는 서버입니다.
package Navi.edu;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.util.Log;
public class socketfunc {
public static String msg = null; // 메시지
public static String ip = null; // 주소
// 생길때 마다 TCP소켓 쓸꺼 하나 만든거지...
public static void TCPset(String msgstr) {
TCPclient tp = new TCPclient(msgstr);
tp.run();
}
public static class TCPclient implements Runnable {
private static final int serverPort = 5557; // 포트넘버
private String return_msg; // 반환 메시지
public TCPclient(String msgstr) {
msg = msgstr;
}
public void run() {
// TODO Auto-generated method stub
try {
InetAddress serverAddr = InetAddress.getByName(ip);
Log.d("TCP", "C; ing.");
// 소켓 이상하게 만들지 말라고 만든거..
System.setProperty("java.net.preferIPv6Addresses", "false");
Socket socket = new Socket(serverAddr, serverPort);
try {
Log.d("TCP", "C: ing2 '" + msg + "'");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(),
"euc-kr")), true);
out.println(msg);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
// -----------------------------------------------------------------
// 여기서는 사실.. 반환 메시지를 써야 되는데.. ㅠㅠ 그것도 해결을 못해서..
// 일단은.. 서버로 부터 오는 메시지를 받아버리는 걸로 했습니다.
// -----------------------------------------------------------------
// 받는 것 자체를 화면으로 받아 버릴까?;;; 이것만 해결되면 거의 완성인데...
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
return_msg = in.readLine();
File f = new File("/mnt/sdcard/now.jpg");
FileOutputStream output = new FileOutputStream(f);
byte[] buf = new byte[1024];
while (socket.getInputStream().read(buf) > 0) {
output.write(buf);
output.flush();
}
// in.close();
// output.close();
Log.d("TCP", "C: Server send to me this message -->"
+ return_msg);
} catch (Exception e) {
Log.e("TCP", "C: Error1", e);
} finally {
socket.close();
}
} catch (Exception e) {
Log.e("TCP", "C: Error2", e);
}
}
}
}
에러 메시지 입니다..
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at mytest.TCPServer.run(TCPServer.java:83)
at java.lang.Thread.run(Unknown Source)
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at mytest.TCPServer.run(TCPServer.java:83)
at java.lang.Thread.run(Unknown Source)
아마.. ..ㅠㅠ. 일단.. 이거라도 해결해 주실 용자분? ㅠㅠ
사실.. 저곳에서도.. 나눠야 됩니다.
무조건 파일스트림 받아서.. 사진으로 만드는 것 보다는..
어떤 조건부로.. 파일을 저장하고.. 아니면 기본적으로 string이 반환되게.. 해야 합니다. .ㅠㅠ