GDJ 9/13

Yongha Hwang·2023년 9월 13일
0

NetWork

1. Echo Server

클라이언트가 전송해주는 데이터를 그대로 되돌려 전송해 주는 기능을 가진 서버

  • Server
		ServerSocket server = null;// 1. 서버소켓 준비
		
		try {
			// 2. 서버소켓 생성(열어줄 포트 지정)
			server = new ServerSocket(5001);			
			while(true) {// 3. 요청대기(접속 요청이 있을떄 까지)
				System.out.println("요청 대기 중...");
				Socket socket = server.accept(); // blocking 역활
				// 4. 접속 요청이 오면 요청자 정보 출력	
				InetSocketAddress addr = (InetSocketAddress) socket.getRemoteSocketAddress();
				System.out.println(addr.getAddress()+":"+addr.getPort());
				
				//InputStream 사용하여 데이터 읽는 순서
				//4-1. 스트림준비 - 주(socket 에서 뽑아올 예정)+보조
				InputStream is = socket.getInputStream();
				BufferedInputStream bis = new BufferedInputStream(is);
				ObjectInputStream ois = new ObjectInputStream(bis);
								
				//4-2. 읽어오기
				String msg = ois.readUTF();
				//4-3. 읽어온 데이터 처리(출력, 기타 등등...)
				System.out.println("client message : "+msg);				
								
				//OutputStream 사용하여 데이터 쓰는 순서
				//4-1. 스트림준비 - 주(socket 에서 뽑아올 예정)+보조
				OutputStream os = socket.getOutputStream();
				BufferedOutputStream bos = new BufferedOutputStream(os);
				ObjectOutputStream oos = new ObjectOutputStream(bos);
				//4-2. 쓰기(파일? 콘솔?)
				oos.writeUTF("[당신이 보낸 메시지] "+msg);
				
				//4-3. 자원 반납(flush)
				oos.flush();
				ois.close();				
				oos.close();				
				
			}					
		} catch (Exception e) {
			e.printStackTrace();
			// 5. 예외 발생시 종료
			server.close();
		}
  • Client
// 1. 소켓생성(접속요청)
		Socket socket = new Socket("192.168.70.138", 5001);
		System.out.println("접속 완료!!");// 2. 예외발생하지 않으면 접속 완료		
		
		// 2-1. 메시지 보내기(아무거나 보내고 싶은거 보내보자)
		// 주 + 보조 스트림 준비
		OutputStream os = socket.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);
		ObjectOutputStream oos = new ObjectOutputStream(bos);		
		// 메시지 보내기
		oos.writeUTF("안녕하세요, 서버님!");			
		oos.flush();// 자원 정리(flush)
		
				
		// 2-2. 받은 내용 출력하기(syso 로 출력)
		// 주+보조 스트림 준비
		InputStream is = socket.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(is);
		ObjectInputStream ois = new ObjectInputStream(bis);		
		// 메시지 읽기
		String msg = ois.readUTF();
		System.out.println(msg);
		// 자원정리(close)
		ois.close();	
		oos.close();
		// 3. 할일이 끝나면 종료
		 socket.close();

2. File 전송

기본적인 구조는 Echo 서버와 동일하나 Stream의 차이가 있다.

  • File Input/output Stream
  • read(), write() (UTF)

3. Chatting 구현

양쪽 모두 수신과 발신이 자유롭게 되는 양방향 통신을 구현하기 위해 Thread 를 사용해 일을 대행 시킨다.

// 1. 서버소켓 준비
		ServerSocket server = null;		
		try {			
			server = new ServerSocket(5252);
            //while 문을 두개 동시에 돌릴수 없으므로 대신 일을 할 Thread 를 생성하여 불러온다.
			while(true) {
				System.out.println("요청 대기"); // 2. 요청 대기
				Socket socket = server.accept(); // 3. 요청 승인
				System.out.println("승인완료");
				// 받아온 소켓을 가지고 전송/수신 스레드를 올린다.
				SenderThread sender = new SenderThread(socket);				
				RecvThread recv = new RecvThread(socket);
				sender.start();
				recv.start();
				
			}						
		} catch (Exception e) { // 4. 예외 발생시 종료
			e.printStackTrace();
			server.close();
		}

4. Webserver 구현

ServerSocket server = null;
		
		try {
			server  = new ServerSocket(8080);
			
			while(true) {
				System.out.println("접속 요청 대기중...");
				Socket socket = server.accept();
				
				InputStream is = socket.getInputStream();
				DataInputStream dis = new DataInputStream(is);
				
				// 클라이언트가 보내온 메시지 받아오기
				byte[] arr = new byte[65536];// http 프로토콜에서 정해준 최대 byte 수		
				dis.read(arr);
				// 문자열화 해서 출력
				String request = new String(arr); // header + body
				System.out.println(request);
				
				// 응답(response) 만들기
				OutputStream os = socket.getOutputStream();
				PrintStream ps = new PrintStream(os);				
				// header
				ps.print("HTTP/1.1 200 \r\n");
				ps.print("Content-Type: text/html \r\n");
				ps.print("\r\n"); // header 와  body 를 구분짓는 빈 줄
				//body
				ps.print("<h3>Success Receive</h3>");
				ps.flush();
				
				// 자원반납
				dis.close();
				ps.close();
				socket.close();			
			}			
		} catch (Exception e) {
			e.printStackTrace();
			server.close();
		}

0개의 댓글

관련 채용 정보