package ch19.sec04;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.util.Scanner;
public class NewsServer {
private static DatagramSocket datagramSocket = null;
public static void main(String[] args) throws Exception {
System.out.println("--------------------------------------------------------------------");
System.out.println("서버를 종료하려면 q를 입력하고 Enter 키를 입력하세요.");
System.out.println("--------------------------------------------------------------------");
//UDP 서버 시작
startServer();
//키보드 입력
Scanner scanner = new Scanner(System.in);
while(true) {
String key = scanner.nextLine();
if(key.toLowerCase().equals("q")) {
break;
}
}
scanner.close();
//TCP 서버 종료
stopServer();
}
public static void startServer() {
//작업 스레드 정의
Thread thread = new Thread() {
@Override
public void run() {
try {
//DatagramSocket 생성 및 Port 바인딩
// udp를 이용한 서버쪽
// 포트만 열면 됨
datagramSocket = new DatagramSocket(50001);
System.out.println( "[서버] 시작됨");
while(true) {
//클라이언트가 구독하고 싶은 뉴스 주제 얻기
// 클라이언트 소켓 객체 생성할때 IP, 포트번호만, new
DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(receivePacket);
String newsKind = new String(receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8");
//클라이언트의 IP와 Port 얻기
SocketAddress socketAddress = receivePacket.getSocketAddress();
//10개의 뉴스를 클라이언트로 전송
for(int i=1; i<=10; i++) {
String data = newsKind + ": 뉴스" + i;
byte[] bytes = data.getBytes("UTF-8");
DatagramPacket sendPacket = new DatagramPacket(bytes, 0, bytes.length, socketAddress);
datagramSocket.send(sendPacket);
}
}
} catch (Exception e) {
System.out.println("[서버] " + e.getMessage());
}
}
};
//스레드 시작
thread.start();
}
public static void stopServer() {
//DatagramSocket을 닫고 Port 언바인딩
datagramSocket.close();
System.out.println( "[서버] 종료됨 ");
}
}
package ch19.sec04;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class NewsClient {
public static void main(String[] args) {
try {
//DatagramSocket 생성
DatagramSocket datagramSocket = new DatagramSocket();
//구독하고 싶은 뉴스 주제 보내기
String data = "정치";
byte[] bytes = data.getBytes("UTF-8");
DatagramPacket sendPacket = new DatagramPacket(
bytes, bytes.length, new InetSocketAddress("localhost", 50001)
); // byte, bytes.length : 전송할 데이터, 전송할 데이터의 길이
datagramSocket.send(sendPacket); // 전송
while(true) {
//뉴스 받기
DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(receivePacket);
//문자열로 변환
String news = new String(receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8");
System.out.println(news);
//10번째 뉴스를 받았을 경우 while 문 종료
if(news.contains("뉴스10")) {
break;
}
}
//DatagramSocket 닫기
datagramSocket.close();
} catch(Exception e) {
}
}
}