[JAVA] Day 20 - Server / Socket

sue·2023년 12월 11일

📒국비학원 [JAVA]

목록 보기
18/20
post-thumbnail

Socket

: 네트워크상에서 데이터 주고받을 수 있도록

  • 클라이언트와 서버는 소켓 사용해서 통신함
  • 클라이언트 : 서버IP랑 포트에 연결된 소켓생성
    서버 : 클라이언트의IP와 포트에 연결된 소켓 생성
  • 소켓을 통해 데이터

InputStream : 바이트 단위로 데이터를 읽을 수 있는 입력 스트림
getInputStream() : Socket 클래스의 메소드 / 클라이언트에서 서버로부터 오는 (네트워크 소켓을 통해) 데이터를 읽기위한 통로

프로토콜(Protocol) :

  • 컴퓨터나 기기간에 통신하기위한 규칙
  • HTTP(Hyper Text Transfer Protocol) : 웹에서 데이터 주고받기 위한 프로토콜
  • TCP (Transmission Control Protocol)
  • UDP (User Datagram Protocol)

📌 Note Code




1. 배경색에 내가 클릭한 좌표 띄우기

Test1

💻 입력


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//마우스 event

public class Test1 extends Frame {

	private static final long serialVersionUID = 1L;

	private int x, y;

	private Label lbl = new Label("",Label.CENTER);
	
	
	public Test1() {

		add(lbl,BorderLayout.SOUTH);
		
		addMouseListener(new MouseHandler());
		addMouseMotionListener(new MouseMotionHandler());
		
		setBackground(new Color(150, 150, 150));//배경색
		setForeground(new Color(0, 0, 255));//글자색
		
		
		addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

		});

		setTitle("좌표출력");
		setSize(400, 400);
		setVisible(true);

	}

	
	public static void main(String[] args) {
		
		new Test1();
	}


	//paint랑 update는 마우스 가장 기본메서드
	@Override
	public void paint(Graphics g) {
		
		String str;
		str = "("+x+","+y+")";
		g.drawString(str,x,y);
	
	}



	@Override
	public void update(Graphics g) { //드래그를 하게되면 .....점들이 이어진 과거를 기억 = 누적
		paint(g);
	}

	
	class MouseHandler extends MouseAdapter{

		@Override
		public void mousePressed(MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			repaint(); //update() 호출 -> paint() 호출
		}

		@Override
		public void mouseReleased(MouseEvent e) {
	
		}

	}
	
	class MouseMotionHandler extends MouseMotionAdapter{

		@Override
		public void mouseDragged(MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			repaint(); //update() 호출 -> paint() 호출
		}

		@Override
		public void mouseMoved(MouseEvent e) {
			String str = String.format("(%d,%d)", e.getX(),e.getY());
			lbl.setText(str);
		}
	}
}


💡 **출력**
[좌표출력]



📌 Note Code







2. 메뉴바 만들어보기

Test2

💻 입력


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//마우스 event

public class Test1 extends Frame {

	private static final long serialVersionUID = 1L;

	private int x, y;

	private Label lbl = new Label("",Label.CENTER);
	
	
	public Test1() {

		add(lbl,BorderLayout.SOUTH);
		
		addMouseListener(new MouseHandler());
		addMouseMotionListener(new MouseMotionHandler());
		
		setBackground(new Color(150, 150, 150));//배경색
		setForeground(new Color(0, 0, 255));//글자색
		
		
		addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

		});

		setTitle("좌표출력");
		setSize(400, 400);
		setVisible(true);

	}

	
	public static void main(String[] args) {
		
		new Test1();
	}


	//paint랑 update는 마우스 가장 기본메서드
	@Override
	public void paint(Graphics g) {
		
		String str;
		str = "("+x+","+y+")";
		g.drawString(str,x,y);
	
	}



	@Override
	public void update(Graphics g) { //드래그를 하게되면 .....점들이 이어진 과거를 기억 = 누적
		paint(g);
	}

	
	class MouseHandler extends MouseAdapter{

		@Override
		public void mousePressed(MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			repaint(); //update() 호출 -> paint() 호출
		}

		@Override
		public void mouseReleased(MouseEvent e) {
	
		}

	}
	
	class MouseMotionHandler extends MouseMotionAdapter{

		@Override
		public void mouseDragged(MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			repaint(); //update() 호출 -> paint() 호출
		}

		@Override
		public void mouseMoved(MouseEvent e) {
			String str = String.format("(%d,%d)", e.getX(),e.getY());
			lbl.setText(str);
		}
	}
}


💡 **출력**
[그림출력]



📌 Note Code




3. Class 클래스

Test3

💻 입력



//Class 클래스
//특정 클래스나 인터페이스의 정보를 검색

class Test{
	
	public void write() {
		System.out.println("테스트");
	}

}

public class Test3 {

	public static void main(String[] args) throws Exception {

		Class c = Class.forName("com.day20.Test"); // **Class(클래스).forName(메서드)("패키지이름.클래스이름") ->  throws Exception 예외처리 필수
		
		Object o = c.newInstance(); //클래스를 객체생성도 할 수 있다는 것을 보여줌 
		
		Test t = (Test)o;
		
		t.write();
		
	}

}


💡 **출력**
테스트



📌 Note Code


  • 우리가 칠 일 없음



4. 클래스 정보 출력

Test4

💻 입력


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test4 {

	public static void main(String[] args) {

		
		try {
		
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println("클래스명[java.lang.String] : ");
			
			String str = br.readLine();
			
			Class cls = Class.forName(str); //**기억해두기 
			
			//생성자 정보 - 배열
			System.out.println("생성자");
			Constructor[] c = cls.getConstructors();
			for(int i = 0; i<c.length;i++) {
				System.out.println(c[i]);
			}
			
			
			//필드 (=변수)
			System.out.println("필드");
			Field[] f = cls.getFields();
			for(int i = 0; i<f.length;i++) {
				System.out.println(f[i]);
			}
			
			//메서드
			System.out.println("메서드");
			Method[] m = cls.getMethods();
			for(int i = 0; i<m.length;i++) {
				System.out.println(m[i]);
			}
			
		} catch (Exception e) {

		}
		
	}

}


💡 **출력**
클래스명[java.lang.String] : 
java.util.Scanner
생성자
public java.util.Scanner(java.io.InputStream,java.nio.charset.Charset)
public java.util.Scanner(java.io.InputStream,java.lang.String)
public java.util.Scanner(java.io.InputStream)
.
.
.



📌 Note Code


  • c[a-z] : c로 시작하는 영단어 ( c,c,cda)
  • c[a-z] : c로 시작하는 2개의 단어(ca,cf)
  • c[a-zA-Z0-9] : ca,cA,c9
  • [\w]+ : 한글자 이상의 영,숫자
  • (\.[\w]+) : 괄호안에 있는 것은 반드시 한번은 사용해야함
  • \. : 도트는 반드시 와야함



5. 정규화표현식

Test5

💻 입력


import java.util.regex.Matcher;
import java.util.regex.Pattern;

//정규화표현식
public class Test5 {

	public static void main(String[] args) {
		
		String[] str = {"bat","baby","bonus","c","cA","ca","c.","c0",
				"car","combat","count","date","disc"}; 

		Pattern p;

		p = Pattern.compile("c[a-z]*");
		for (String s : str) {
			Matcher m = p.matcher(s);

			if (m.matches()) {
				System.out.println(s);
			}
		}

		System.out.println("------------------------");

		p = Pattern.compile("c[a-z]+"); // 하나이상의 문자
		for (String s : str) {
			Matcher m = p.matcher(s);

			if (m.matches()) {
				System.out.println(s);
			}
		}

		System.out.println("------------------------");
		p = Pattern.compile("c.+"); // 하나이상의 문자
		for (String s : str) {
			Matcher m = p.matcher(s);

			if (m.matches()) {
				System.out.println(s);
			}
		}

		
		System.out.println("------------------------");
		
		String[] mail = {"aaa@aaa.com","@@aaa.co.kr",
				".@bbb.com", "aaa@vvv.vo.kr","sss.co.kr",
				"abc@abc"};
		
		//           [\\w]+ : 한글자 이상의 영,숫자
		//           (\\.[\\w]+) : 괄호안에 있는 것은 반드시 한번은 사용해야함
		//            \\. :  도트는 반드시 와야함
		
		String pat = "[\\w]+@[\\w]+(\\.[\\w]+)+"; 
			
		for(String ss : mail) {
			if(Pattern.matches(pat, ss)) {
				System.out.println(ss);
			}
		
		}
	}
}


💡 **출력**
c
ca
car
combat
count
------------------------
ca
car
combat
count
------------------------
cA
ca
c.
c0
car
combat
count
------------------------
aaa@aaa.com
aaa@vvv.vo.kr



📌 Note Code




6. 정규화표현식 (Pattern / Matcher)

Test6

💻 입력


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test6 {

	public static String replaceAll(String str, String oldStr, String newStr) {

		// String데이터 비교할때 기본적으론 equals인데 null을 비교할땐 == 을 써도됨
		if (str == null) {
			return null;
		}

		Pattern p = Pattern.compile(oldStr);

		Matcher m = p.matcher(str); // oldStr을 입력한 p를 str에 매치한다

		StringBuffer sb = new StringBuffer();

		while (m.find()) {
			m.appendReplacement(sb, newStr); // 새로운 단어인 newstr을 찾는다
		}

		m.appendTail(sb); //대한으로만 끝나지않고 뒤에 나머지 내용들이 붙음
		return sb.toString();

	}

	public static void main(String[] args) {

		String str = "우리나라 대한민국 대한독립만세 대한의 건아";
		
		String s = Test6.replaceAll(str,"대한","大韓"); //static으로 만들었으니까 Test6.으로 바로 찾을 수 있음

		System.out.println(s);
	}

}


💡 **출력**
우리나라 大韓민국 大韓독립만세 大韓의 건아



📌 Note Code




7. IP주소 / Host

Test7

💻 입력


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;

public class Test7{

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String host;
		
		System.out.println("호스트[www.naver.com]?: ");
		host = br.readLine();
		
		InetAddress ia = InetAddress.getByName(host);
		System.out.println("ip주소: "+ia.getHostAddress());
		System.out.println("호스트 : "+ia.getHostName());
		
		//	http://www.naver.com
		// 	http : 프로토콜 (protocol - 통신규약) , FTP(인터넷에서 다운),SMTP(메일 보낼때),POP3(메일 받을때),NNTP
		//	hyper text transfer protocol 
		//  naver.com : domain  도메인 
		// 	www : host domain 호스트 도메인 - World Wide Web - 거미줄
		//	DNS : 도메인 이름 시스템` /  도메인 이름과 IP 주소를 서로 변환하는 역할 / 웹에서 도메인을 정리하고 확인하는 전화번호부와 같은 역할 / 주소를 분해
		
		//10진수 (사람이 이해할 수 있는 숫자) : 192.168.16.0 등
		
		//IPV40 - 32bit  
		// 0~2555 : 000000000.00000000. ~ [255나누기 2진수로 하면] 11111111. 1*8 . 1*8 .1*8  = 8*4 =32 (bit)
		
		
		//IPV6 - 286bit
	}

}


💡 **출력**
호스트[www.naver.com]?: 
www.naver.com
ip주소: 223.130.195.200
호스트 : www.naver.com



📌 Note Code




8. 창 frame 만들기

Test8

💻 입력


import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

//소스를 볼 수 있는 창 frame  만들기

public class Test8 extends Frame implements ActionListener{

	private static final long serialVersionUID = 1L;

	private TextArea ta;
	private TextField tf;
	
	public Test8() {
		
		ta = new TextArea();
		add(ta);
		
		tf = new TextField();
		tf.addActionListener(this);
		add(tf,BorderLayout.NORTH);
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
				
			}
		});
		
		setTitle("HTML Viewer");
		setSize(400, 300);
		setVisible(true);
		
		
	}
	
	public static void main(String[] args) {
		new Test8();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		try {
			
			String str;
			
			URL url = new URL(tf.getText()); //입력한 주소를 읽어서 url로 넘어옴
			ta.setText(""); //데이터를 새로운거 입력하기위해서 초기화
			
			InputStream is = url.openStream(); //url에 찾아가서 도메인을 찾고 -> ip를 찾겠지? 그 다음  openStream 통로를 통해 is내용을 boderlayout에 넣음
			
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			
			while((str=br.readLine())!=null){
			
				if(ta.getText().equals("")){ //아무것도 없고 처음 딱 쓸 때
					ta.setText(str); //textarea에 str를 입력하고
				}else {
					ta.setText(ta.getText()+"\r\n"+str); // i=i+1
				}
			}
			
			is.close();
			
		} catch (Exception e2) {
		
		}
	}
}


💡 **출력**
[그림참고]


0개의 댓글