상세 컨텐츠

본문 제목

Java - ServerSocket, 클라이언트에 응답하기

개발/Java

by 뉴에이스 2018. 10. 4. 14:17

본문

	클라이언트쪽으로 오늘의 운세를 보내주는 서버
	
	브라우저와 HTTP 통신을 위해서는 응답시 HTTP 규격에 정해진 방식대로 데이터를 전송
	
	시작라인 : 프로토콜버전	응답코드	응답메세지
	헤더
	헤더
	헤더
	[공백한줄]
	바디 : 전송할 메세지
	
	HTTP/1.1 200 OK\r\n
	a: b\r\n
	c: d\r\n
	\r\n
	aaaa

 

소스

 

public static void main(String[] args) {
	try {
		String[] data = {
				"복권 1등 당첨 운입니다.",
				"동쪽으로 가면 귀인을 만납니다.",
				"축하합니다. 자율학습 9시 당첨입니다.",
				"갈수록 얼굴이 멋있어 집니다.", 
				"살 빠집니다.",
				"5월에 결혼할 운입니다.",
				"비트코인이 2000만원 돌파..",
				"비트코인 100만원 ^^",
				"기계 오류로 출석이 취소되었습니다.",
				"집에 가다 넘어짐 ^^ 야호~~"
		};
		Random r = new Random();
		ServerSocket ss = new ServerSocket(8000);
		
		while(true) {
			Socket s = ss.accept();
			System.out.println("요청한 사용자의 보내준 데이터 확인하기");
			System.out.println("=============================");
			BufferedReader br = new BufferedReader(
					new InputStreamReader(s.getInputStream())
					);
			// 시작라인의 정보
			// GET/POST URI ProtocolVersion
			// GET : GET /board/update?no=1
			// POST : /board/update
			// body : no=1
			String reqStartLine = br.readLine();
			String reqHeader = "";
			while(true) {
				String line = br.readLine();
				if(line.equals("")) break;
				
				reqHeader += line + "";
			}
			
			String msg = "<html>" + 
					"		 <head>" + 
					"		<style>" + 
					"		   div {" + 
					"           font-size: 10px;" + 
					"           border: 5px solid tomato;" + 
					"           background: black;" + 
					"           color: white;" + 
					"           border-radius: 15px;" + 
					"           transition: 0.5s;" + 
					"        }" + 
					"        div:hover {" + 
					"        background: skyblue;" + 
					"        color: orange;" + 
					"	     }" + 
					"    </style>" + 
					"   </head>" + 
					"   <body>" +
					"<div>" +
					"시작라인 : " + reqStartLine + "<br>" +
					""		+ "헤더 : <br>" +
					reqHeader +
					"</div>"
					+ "</body>" + 
					data[r.nextInt(data.length)];
			
			String startLine = "HTTP/1.1 200 OK\r\n";
			
			// Content-Type : 보내는 컨텐트 내용에 대한 타입 (브라우저에서 헤더를 보고 해석(파싱)함)
			// text/html : 메인/서브 타입, 타입에러일경우 브라우저에서 다운로드창이 뜸, text/text, text/xml, ...
			// 보내는 데이터의 길이 (바이트의 길이)
			String headers = "Content-Type: text/html;charset=utf-8\r\n"
					+ "Content-Length: " + msg.getBytes("utf-8").length + "\r\n\r\n";
			String body = msg;
			
			String result = startLine + headers + body;
			
			OutputStream out = s.getOutputStream();
			out.write(result.getBytes("utf-8"));
			out.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

결과 (클라이언트 요청(브라우저 접속)시마다 출력)

 

요청한 사용자의 보내준 데이터 확인하기
=============================
요청한 사용자의 보내준 데이터 확인하기
=============================
요청한 사용자의 보내준 데이터 확인하기
=============================
요청한 사용자의 보내준 데이터 확인하기
=============================
요청한 사용자의 보내준 데이터 확인하기
=============================
요청한 사용자의 보내준 데이터 확인하기

 

서버(소스) 구동중인 상태에서 브라우저에서 127.0.0.1:8000 접속시 출력되는 결과 (메시지는 랜덤 출력)

 

시작라인 : GET / HTTP/1.1
헤더 : 
Host: 127.0.0.1:8000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: ko,en-US;q=0.9,en;q=0.8,ja;q=0.7,fil;q=0.6,zh;q=0.5

 

살 빠집니다.

 

 

관련글 더보기

댓글 영역