Closed occidere closed 6 years ago
int status = 500;
byte images[];
package org.occidere.test;
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Arrays;
import capstone.kookmin.commons.protocol.Packet;
public class Main { public static void main(String[] args) throws Exception { String ip = "localhost"; // 우리 서버 주소 입력 int port = -1; // 포트 입력
Client c = new Client(ip, port);
c.run();
} }
/**
*/ class Client { String host; int port; Socket server; ObjectInputStream ois; ObjectOutputStream oos;
public Client(String host, int port) { this.host = host; this.port = port; }
public void run() throws Exception { server = new Socket(host, port);
send(); //이미지 전송 with statusCode: 500 & byte[] images; receive(); //서버로부터 Logical Error 수신 with statusCode: 200 & String[] pseudoLines;
/ close는 맨 마지막에 한번에 / ois.close(); oos.close(); server.close(); }
private void send() { try { File img = new File("test.jpg"); FileInputStream fis = new FileInputStream(img); byte[] images = new byte[(int) img.length()]; fis.read(images); fis.close();
Packet packet = new Packet(500, images);
oos = new ObjectOutputStream(server.getOutputStream()); oos.writeObject(packet); System.out.println("[Client] Send the image packet to server!"); } catch (Exception e) { e.printStackTrace(); } }
private void receive() { try { ois = new ObjectInputStream(server.getInputStream()); Object recv = ois.readObject(); Packet packet = null; if (recv instanceof Packet) { packet = (Packet) recv; } else { throw new Exception("Not Packet type!"); } int statusCode = packet.getStatusCode(); switch (statusCode) { case 100: // success break; case 200: // Logical Error <- 현재 우리 서버(Coway-0.0.0.2)에선 Logical Error에 대한 테스트만 제공중 int[] errorLines = packet.getErrorLines(); String[] pseudoLines = packet.getPseudoLines(); System.err.println("에러 발생 라인"); Arrays.stream(errorLines).forEach(System.err::println); System.err.println("에러 발생 코드"); Arrays.stream(pseudoLines).forEach(System.err::println); break; case 300: // System Error break; default: // error break; } } catch (Exception e) { e.printStackTrace(); return; } } }
/**
@author 이성준 */ class Server extends Thread { ServerSocket server;
public Server(int port) throws Exception { server = new ServerSocket(port); }
@Override public void run() { System.out.println("[Server] Server started"); while (true) { try { Socket client = server.accept(); ObjectInputStream ois = new ObjectInputStream(client.getInputStream()); Object obj = ois.readObject();
Packet packet = null;
if (obj instanceof Packet) {
packet = (Packet) obj;
} else {
throw new Exception("Not Packet type!");
}
int statusCode = packet.getStatusCode();
if (statusCode == 500) {
byte[] images = packet.getImages();
System.out.println("[Server] status code: " + statusCode);
String fileNames = "img_" + System.currentTimeMillis();
FileOutputStream fos = new FileOutputStream(fileNames);
fos.write(images);
fos.close();
}
System.out.println("[Server] image processing ...");
System.out.println("[Server] Sending result to client");
ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
oos.writeObject(new Packet(200, new int[] { 1 }, new String[] { "for(i=0~N){", "println(i)", "}" }));
/* Close는 마지막에 한번에 */
ois.close();
oos.close();
client.close();
System.out.println("[Server] client disconnected");
} catch (Exception e) { e.printStackTrace(); } } } }
Packet 프로토콜 구조
capstone.kookmin.commons.Packet
패키지로 관리Header 부분
int statusCode;
// 상태코드int errorLines[];
// 빨간 줄 칠 에러 발생 라인 정보가 담긴 배열Body 부분
String pseudoLines[];
// 성공 또는 Logical Error 시 보여줄 수도코드가 담긴 배열String javaLines[];
// 성공 시 보여줄 자바코드가 담긴 배열byte images[];
//처음 안드로이드에서 사진을 보내기 위한 바이트 배열참고