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

}

 

 

 

반응형