FIF's 코딩팩토리

[Java] http를 이용한 에코서버 (Echo Server)구현 본문

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();
}
}
}

 

 

 

반응형

'Back-End > Java(자바)' 카테고리의 다른 글

[Java] API도큐먼트 읽는방법  (0) 2021.02.18
[Java] 필드(field)  (0) 2020.02.18
[Java]소켓(Socket)을 이용한 에코서버(Echo Server) 구현  (0) 2019.12.23
[Java] String format 예제  (0) 2019.11.26
[Java] Set  (0) 2019.11.07
Comments