Back-End/Java(자바)
[Java] http를 이용한 에코서버 (Echo Server)구현
FIF
2019. 12. 23. 13:54
반응형
저번에는 소켓을 이용해서 에코서버를 구현해 보았다.
이번에는 httpHttpURLConnection 과 서블릿을 이용하여 에코서버를 구현해 보겠다.
프로젝트는 Dynamic Web Project로 만든다.
서버는 Tomcat을 사용한다.
HTTPEchoServer
HttpServlet을 상속받아 doPost메소드를 사용한다.
InputStream과 ByteArrayOutputStream을 사용한다.
package httpecho;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// http://[서버의 ip주소]:[포트번호]/[프로젝트명]/[매핑 이름]
// http://localhost:8080/EchoProject/main
@SuppressWarnings("serial")
@WebServlet("/main")
public class HTTPEchoServer extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 2> 클라이언트에서 전송한 메시지를 받는 객체
InputStream in = req.getInputStream();
//InputStreamReader, BufferedReader를 사용하지 않고 하는 방법
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int cnt;
while ((cnt = in.read(bytes)) != -1) {
baos.write(bytes, 0, cnt);
}
byte[] byteData = baos.toByteArray();
String data = new String(byteData);
System.out.println("클라이언트 에서 받은 데이터: " + data);
// 3> 받은 데이터를 클라이언트에 재전송할 객체
OutputStream out = resp.getOutputStream();
//재전송
out.write(byteData);
out.flush();
in.close();
out.close();
}
}
HTTPEchoClient
서버를 가동시킨 후 클라이언트를 실행하면 서버에 보낸 데이터를 그대로 받을 수 있다.
package httpecho;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class HTTPEchoClient {
public static void main(String[] args) {
new HTTPEchoClient();
}
public HTTPEchoClient() {
init();
}
public void init() {
try {
URL url = new URL("http://localhost:8080/EchoProject/main");
HttpURLConnection con = (HttpURLConnection) url.openConnection();// HTTP Connection 구하기
System.out.println("init2() 연결 성공");
con.setRequestMethod("POST");// 요청 방식 설정
con.setConnectTimeout(3000);// 연결 타임 아웃 설정 (3초)
con.setReadTimeout(3000);// 읽기 타임아웃 설정(3초)
con.setDoOutput(true);
con.setDoInput(true);
// 1> 서버에 데이터를 전송할 객체
OutputStream out = con.getOutputStream();
String data = "hello";
System.out.println("서버에 보내는 데이터: " + data);
byte[] bytes = data.getBytes();
out.write(bytes);
out.flush();
System.out.println("응답 코드: " + con.getResponseCode());// 요청 처리 성공
// 4>서버에서 재전송한 데이터를 받는 객체
InputStream in = con.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes2 = new byte[1024];
int cnt;
while ((cnt = in.read(bytes2)) != -1) {// 바이트 배열에
baos.write(bytes2, 0, cnt);
}
byte[] byteData = baos.toByteArray();
String echoData = new String(byteData);
System.out.println("서버에서 받은 데이터: " + echoData);
//메모리의 누수방지를 위해 꼭 닫아준다
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
반응형