반응형
- UniCast
Uni(단일) + Cast(던지다) -> 단일 노드(연결된 장치)에 데이터를 보낸다.
송신 노드와 수신 노드 간 1:1 지속적인 통신 개념.
- 원리
데이터를 보낼 곳에 Mac 주소를 프레임(데이터)에 포함시켜 보내는 방식이다.
Mac 주소를 찾아 통신을 하고, 요청을 받을 네트워크에 있는 노드들은 자신의 Mac 주소와 요청을 한 곳의 Mac 주소를 비교했을 때 동일하지 않으면 패킷이 LAN 카드에서 Mac 주소가 동일하지 않음을 구분하여 해당 프레임을 버리기 때문에 CPU 성능을 저하시키지 않는다.
따라서 출발지와 목적지가 확실해야 한다.
* LAN (Local Area Network} :네트워크 안에서 컴퓨터간의 통신을 할 때 사용하는 장비 중 하나로, 네트워크 어댑터나 NIC (Network Interface Card)라고도 하며, 자신에게 온 데이터를 CPU에 전달해 준다.
- 서버 프로그램
package D2;
import java.net.ServerSocket;
import java.net.Socket;
public class UniServer {
public static void main(String[] args) {
//서버 프로그램에만 사용하는 소켓.
//하나의 TCP 포트를 열어서 이곳의 연결 요청을 받을 때 사용하는 클래스.
//클라이언트에서 요청이 오길 기다렸다가 연결 요청이 오면 클라이언트와 연결을 맺고 다른 소켓을 만듦.
ServerSocket ss = null;
//TCP를 사용해 프로그램끼리 통신하려면 연결을 해야 한다.
//연결을 위해선 연결 끝점이 필요하고 이가 소켓이다.
//연결 끝점(End Point)이란 IP 주소와 Port 번호의 조합을 의미하며, 최종 목적지를 의미한다.
Socket s = null;
try {
//서버 소켓 생성.
ss = new ServerSocket(9000);
System.out.println("Waiting for client..");
//클라이언트 소켓 연결 수락, 수신받음.
//연결을 받아 클라이언트 소켓을 생성해 반환한다.
s = ss.accept();
//Main 메서드가 끝날 때까지 동작을 멈추지 않는 스레드를 사용.
Thread st = new SenderThread(s);
Thread rt = new ReceiverThread(s);
//스레드 실행.
st.start();
rt.start();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
//연결 소켓 닫음.
ss.close();
} catch (Exception e) {
}
}
}
}
- 클라이언트 프로그램
package D2;
import java.net.*;
public class UniClient{
public static void main(String[] args) {
Socket s = null;
try{
//호스트 이름과 포트 번호를 입력해 소켓 생성.
s = new Socket("127.0.0.1", 9000);
System.out.println("Press \"exit\" to finish.");
Thread st = new SenderThread(s);
Thread rt = new ReceiverThread(s);
st.start();
rt.start();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
- 요청 보내는 스레드
package D2;
import java.io.*;
import java.net.Socket;
public class SenderThread extends Thread {
Socket s;
public SenderThread(Socket s) {
this.s = s;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter bw = new PrintWriter(s.getOutputStream());
bw.flush();
while (true) {
//버퍼에 저장된 문자열을 읽어 가져와 저장.
String str = br.readLine();
//읽어 가져온 문자열이 "exit"이면 스레드 종료.
if (str.equals("exit"))
System.out.println("Exit the program..");
break;
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
s.close();
} catch (Exception ignored) {
}
}
}
}
- 요청 받는 스레드
package D2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class ReceiverThread extends Thread {
Socket socket;
public ReceiverThread(Socket socket) {
this.socket = socket;
}
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = br.readLine();
if(str == null)
break;
System.out.println("Received message : " + str);
}
} catch (IOException e){
System.out.println(e.getMessage());
}
}
}
1:1 대화를 하는 프로그램으로 보면 좋을 것 같다.
반응형