소켓통신

원래는 약속없는 통신이지만 약속을 붙이면 지그비, http, mqtt가 된다.

소켓통신은 약속 없는 통신

소켓통신은 socket이란 명령어를 가지고 있다.

모든 컴퓨터는 통신을 하기 위해 출구가 필요하다.

각각의 프로그램이 각각 통신을 위한 선이 필요하지만 현실적으로 컴퓨터에 연결되어 있는 선은 하나이기 때문에 각각 통신하기 위해서 포트가 필요하다.

(포트가 없으면 컴퓨터가 데이터를 어떤 프로그램에게 줘야할지 알 수 없다.)

소켓을 달았다는 것은 통신을 하겠다는 의미, 양방향 통신이 됨,

서로 스트림만 연결해주면 됨(BufferedReader, BufferedWriter를 달아서 통신)

서버소켓 ------------------------ 클라이언트소켓

양끝단에 포트를 두고 통신하는 것을 소켓통신이라고 한다.

소켓은 OS가 들고있다.

OS가 들고 있는 것을 빌려쓰는 것을 시스템콜이라고 한다.

소켓을 각자 달면 일대일 통신만 된다. 다대다 통신을 위해서 자바는 new 해서 객체를 만든 후 서버소켓이라는 클래스를 사용해서 사용하면 된다.

서버소켓은 통신을 하는 애가 아니고 accept를 한다.

서버소켓이 하는 일

어떤 소켓에서 접근요청이 오면

1. 새로운 소켓을 생성한다.

2. 서버소켓과 연결된 선을 끊는다.

3. 새로운 소켓을 연결요청이 들어온 소켓(클라이언트 소켓)에 연결한다.

4. 다시 accept요청을 대기한다.

이렇게 하면 소켓을 만들어서 각자 통신을 하고 서버소켓은 다른 소켓이 연결요청이 들어오면 반응할 수 있다.

소켓이 만들어질때마다 스레드가 필요하다.

스레드가 없는 통신도 가능(1대1)

package ch15;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MySocketServer {

	ServerSocket serverSocket; // 소켓 생성
	Socket socket;
	BufferedReader br; // 전역으로 빼줌

	public MySocketServer() throws Exception {

		serverSocket = new ServerSocket(15000); // 서버 소켓 생성
		socket = serverSocket.accept(); // 요청대기
		System.out.println("요청이 들어옴");

		br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		String msg = "";

		while ((msg = br.readLine()) != null) {
			System.out.println("sender :" + msg);
		}

		br.close();
		socket.close();
		serverSocket.close();

	}

	public static void main(String[] args) {
		try {
			new MySocketServer();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

소켓서버

 

package ch15;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MySocketClient {

	Socket socket;
	BufferedWriter bw;
	BufferedReader br;

	public MySocketClient() throws Exception {
		socket = new Socket("192.168.0.47", 15000); // 서버소켓의 accept() 함수를 호출
		bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		br = new BufferedReader(new InputStreamReader(System.in));

		String msg = "";
		while ((msg = br.readLine()) != null) {
			bw.write(msg +"\n");
			bw.flush();
		}
		bw.close();
		br.close();
		socket.close();
	}

	public static void main(String[] args) {
		try {
			new MySocketClient();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

소켓 클라이언트

소켓을 생성해준다.

소켓 선언은 위에서 하고 실제로 만들어진건 하단 네모박스에서 만들어진다.

클라이언트요청을 대기하고 있다.

serverSocket에서 new를 띄운 후 임의로 포트번호를 입력한다. (ex15000)

포트가 충돌나거나, 없는 포트 번호일 수 있기 때문에 try catch해준다

BufferedReader로 소켓을 읽는다.

readLine으로 읽고, null이 아닐경우 해당 값을 출력한다.

전체가 다 try catch 구문일때 함수 옆에 try catch를 걸어준다.

함수를 호출한 애한테 넘겨준다.

catch는 나를 호출한 애가 처리해야한다.


내부클래스

 

package ch15;

class MyOuterClass {
	static int outerNum = 10;

	public MyOuterClass() {
		MyInnerClass mc = new MyInnerClass();
		System.out.println(mc.innerNum);
	}
	
	class MyInnerClass {
		int innerNum = 20;
	}
}

public class InnerEx01 {

	public static void main(String[] args) {
		MyOuterClass moc = new MyOuterClass();
		MyOuterClass.MyInnerClass d = moc.new MyInnerClass();
	}

}

외부클래스에서 나만 접근하고 싶을 때 사용한다.

잘 사용하지는 않지만 문법을 알아두면 좋다.

static 하면 접근가능

InnerClass에 static을 띄우지 않으면

하단에 new로 MyOuterClass을 띄어준다

이 경우 int랑 InnerClass 이름만 뜬 상태 !

이후 moc.new MyInnerclass를 불러온다.


모스키토 통신

유튜브를 구독하면 구독자가 자동적으로 통신이 연결되는 방식

유튜브에서 유래된 통신

브로드캐스트 통신

사용자가 연결할지 말지 결정하는 방식

ex) wifi

메시네트워크

블루투스 통신

페어링 없이 통신, 기본적으로 1:1 통신


Finally

package chat;

interface StarUnit {
	abstract int getHp();
}

abstract class protoss implements StarUnit {
	abstract int getSh();
}

abstract class Zerg implements StarUnit {

}

class Zealot extends protoss {
	int sh = 100;
	int hp = 100;
	
	@Override
	public int getSh() {
		return sh;
	}
	
	@Override
	public int getHp() {
		return hp;
	}
}

class Ultra extends Zerg {
	int hp = 100;

	@Override
	public int getHp() {
		return hp;
	}
}

public class FinallyEx01 {

	// 상태체크 (hp, sh)
	static void check(StarUnit unit) {
		try {
			Zealot z = (Zealot) unit;
			System.out.println("남은 쉴드는 : " + z.getSh());
			System.out.println("남은 체력은 : "+ z.getHp());
		} catch (Exception e) {
			// 저그
			Ultra u = (Ultra) unit;
			System.out.println("저그는 쉴드가 없습니다.");
			System.out.println("남은 체력은 : " + u.getHp());
		}finally {
			
		}
	}

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

}

class 들을 생성한 후 , extends와 implements를 적용시킨다.

공통요소를 abstract로 넣고 생성자를 만들어 준다.

openclose