InetAddressApp
package xyz.itwill.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
// java.net 패키지 : 네트워크 프로그램을 작성하기 위한 기능의 클래스가 선언된 패키지
public class InetAddressApp {
public static void main(String[] args) throws UnknownHostException {
// InetAdress 쿨래스 : 네크워크 식별자(IP 주소 및 호스트이름)를 저장하기 위한 클래스
// InetAddress.getLocalHost() : 현재 사용중인 컴퓨터의 네트워크 식별자가 저장된
// InetAddress 객체를 반환하는 메소드
// > UnknownHostException 발생(일반예외) : 호스트이름의 컴퓨터를 검색할 수 없는 경우 발생되는 예외
// 현재 사용중인 컴퓨터는 기본적으로 [127.0.01]의 IP 주소가 제공되며 [localhost]라는 이름으로 호스트이름 설정
InetAddress myComputer = InetAddress.getLocalHost();
// InetAddress.toString() : InetAddress 객체에 저장된 네트워크 식별자를 문자열로 변환하여 반환하는 메소드
System.out.println("my Computer = " + myComputer);
// InetAddress.getHostName() : InetAddewss 객체에 저장된 네트워크 식별자에서 호스트이름을 문자열로 변환하여 반환하는 메소드
// 호스트이름을 문자열로 변환하여 반환하는 메소드
System.out.println("my Computer = " + myComputer.getHostName());
// InetAddress.getHostAddress() : InetAddress 객체에 저장된 네트워크 식별자에서 IP 주소를 문자열로 변환하여 반환하는 메소드
System.out.println("my Computer = " + myComputer.getHostAddress());
my Computer = Blood/192.000.00.0 // 유저이름 & 아이피주소
my Computer = Blood // 유저이름
my Computer = 192.000.00.0 // 유저이름 & 아이피주소
System.out.println("---------------------------------------------------------------");
// InetAdress.getByName(Sting name) : 매개변수로 전달받은 호스트이름에 대한 네트워크 식별자가 저장된 InetAddress
InetAddress itwill = InetAddress.getByName("www.itwil.xyz");
System.out.println("[www.itwill.xyz]의 IP 주소 = " + itwill.getHostAddress());
System.out.println("---------------------------------------------------------------");
// InetAddress.getAllByName(String name) : 매개변수로 전달받은 호스트이름에 대한
// 네트워크 식별자가 저장된 InetAddress 객체의 배열을 반환하는 메소드
InetAddress[] naver = InetAddress.getAllByName("www.naver.com");
for(InetAddress address : naver) {
System.out.println("[www.naver.com]의 IP 주소 = " + address.getHostAddress());
}
}
}
// TCP 프로그램 : ServerSocket 클래스와 Socket 클래스를 이용하여 작성
// > 서버와 클라이언트가 소켓을 사용하여 1:1로 데이터를 송수신하는 네트워크 프로그램
// 서버(Server) : 외부의 컴퓨터(클라이언트)가 접속할 수 있는 환겨오가 서비스를 제공하기 위한 컴퓨터
// > ServerSocket 클래스를 사용하여 서버 프로그램 작성
// SeverSocket 클래스를 사용하여 사용 가능을 포트번호를 검색하는 프로그램 작성
// > 서버와 클라이언트가 소켓을 사용하여 1:1로 데이터를 송수신하는 네트워크 프로그램
// 서버(Server) : 외부의 컴퓨터(클라이언트)가 접속할 수 있는 환겨오가 서비스를 제공하기 위한 컴퓨터
// > ServerSocket 클래스를 사용하여 서버 프로그램 작성
// SeverSocket 클래스를 사용하여 사용 가능을 포트번호를 검색하는 프로그램 작성
SeverSocketApp
package xyz.itwill.net;
import java.io.IOException;
import java.net.ServerSocket;
public class SeverSocketApp {
public static void main(String[] args) {
for (int i = 2000; i <= 9000; i+=1000 ) {
try {
// ServerSocket 클래스 : 서버 프로그램을 작성하기 위해 사용하는 클래스
// > ServerSocket 클래스의 ServerSocket(int port) 생성자를 이용하여
// 매개변수로 전달받은 포트번호를 활성화하여 ServerSocket 객체 생성
// > ServerSocket 객체를 생성하여 클라이언트가 접속할 수 있는 환경 제공
// > 매개변수로 전달받은 포트번호를 이미 다른 네트워크 프로그램에 사용중인 경우 IOException 발생
ServerSocket serverSocket = new ServerSocket(i);
System.out.println("[메세지]" + i + "번 포트는 네트워크 프로그램에서 사용 가능합니다.");
// SeverSocket.close() : ServerSocket 객체를 제거하는 메소드
// > 클라이언트가 접속할 수 있는 환경 소멸
serverSocket.close();
} catch (IOException e) {
System.out.println("[메세지]" + i + "번 포트는 이미 다른 네트워크 프로그램에서 사용했습니다.");
}
}
}
}
[메세지]2000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]3000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]4000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]5000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]6000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]7000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]8000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]9000번 포트는 네트워크 프로그램에서 사용 가능합니다.
TimeServerApp
package xyz.itwill.net;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
// 접속된 클라이언트에게 서버 컴퓨터의 현재 날짜와 시간을 전달하는 서버 프로그램 작성
// > NTP(Network Time Protocol) Server : 날짜와 시간을 제공하는 서버 컴퓨터
public class TimeServerApp {
public static void main(String[] args) {
ServerSocket ntpServer = null;
try {
// ServerSocket 객체 생성 : 포트를 활성화하여 클라이언트가 접속할 수 있는 환경 제공
ntpServer = new ServerSocket(2000);
// ServerSocket.toString() : ServerSocket 객체에 저장된 접속 관련 정보를 문자열로 반환하는 메소드
// System.out.println("ntpServer = "+ntpServer);
System.out.println("[메세지]NTP Server Running...");
// 서버 프로그램에 다수의 클라이언트 접속을 허용하도록 무한루프 사용
while(true) {
// ServerSocket.accept() : 클라이언트가 접속되면 클라이언트와 값을 주고 받을 수 있는 Socket 객체를 반환하는 메소드
// > 클라이언트가 접속되기 전까지 스레드가 일시 중지되며 클라이언트가 접속되면
// 클라이언트의 소켓과 연결될 소켓을 생성하여 반환하고 스레드 재실행
Socket socket=ntpServer.accept();
//System.out.println("socket = "+socket);
/**
//Socket.getOutputStream() : Socket 객체의 출력스트림(OutputStream 객체)을
//반환하는 메소드
OutputStream stream=socket.getOutputStream();
//OutputStream 객체를 전달받아 객체를 전달할 수 있는 출력스트림으로 확장
ObjectOutputStream out=new ObjectOutputStream(stream);
//출력스트림을 이용하여 시스템의 현재 날짜와 시간이 저장된 Date 객체를 생성
//하여 전달 - 클라이언트에게 날짜와 시간을 전송
out.writeObject(new Date());
*/
new ObjectOutputStream(socket.getOutputStream()).writeObject(new Date());
// 로그 처리 - 기록
//Socket.getInetAddress() : 소켓과 연결된 외부 컴퓨터의 네트워크 식별자가
//저장된 InetAddress 객체를 반환하는 메소드
System.out.println("[정보]클라이언트["+socket.getInetAddress()
.getHostAddress()+"]에게 날짜와 시간을 제공 하였습니다.");
// 클라이언트와의 접속 해제
socket.close();
}
} catch (IOException e) {
System.out.println("[에러]서버 네트워크에 문제가 발생 되었습니다.");
}
}
}
[메세지]NTP Server Running...
TimeClientApp
package xyz.itwill.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
// NTP 서버에 접속하여 서버에서 보내온 날짜와 시간을 제공받아 출력하는 클라이언트 프로그램 작성
public class TimeClientApp {
public static void main(String[] args) throws ClassNotFoundException {
try {
// Socket 클래스 : TCP 프로그램에서 타겟 컴퓨터와 연결을 위한 정보를 저장하기 위한 클래스
// - 다른 컴퓨터의 소켓과 연결되어 값을 송수신할 수 있는 입출력 스트림 제공
// > Socket 클래스의 Socket(String host, int port) 생성자를 이용해 매개변수에
// 접속 컴퓨터의 네트워크 식별자(호스트이름 또는 IP주소)와 활성화된 포트번호를 전달하여 Socket 객체 생성 - 서버 접속
Socket socket = new Socket("192.168.30.8", 2000); // 192.168.13.24 는 컴퓨터 아이피주소
// System.out.println("socket = "+socket);
// Socket.getInputStream() : Socket 객체의 입력스트림(InputStream 객체)를 반환하는 메소드
InputStream stream = socket.getInputStream();
// InputStream 객체를 전달받아 객체를 받을 수 있는 입력스트림으로 확장
ObjectInputStream in = new ObjectInputStream(stream);
// 입력스트림을 이용하여 서버에서 보내온 Date 객체를 반환받아 저장
Date date = (Date) in.readObject();
// Date 객체에 저장된 날짜와 시간을 원하는 형식의 문자열로 변환하여 출력
System.out.println("[결과]서버에서 보내온 날짜와 시간 = "
+ new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초").format(date));
// Socket.close() : Socket 객체를 제거하는 메소드 - 접속 해제
socket.close();
} catch (UnknownHostException e) {
System.out.println("[에러]서버를 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("[에러]서버에 접속 할 수 없습니다.");
}
}
}
[에러]서버에 접속 할 수 없습니다.
EchoServerApp
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
// 클라이언트에서 보내온 메세지를 제공받아 출력하는 서버 프로그램 작성
public class EchoServerApp {
public static void main(String[] args) {
ServerSocket echoServer = null;
try {
echoServer = new ServerSocket(3000);
System.out.println("[메세지]Echo Server Running...");
while(true) {
Socket socket = echoServer.accept();
// 소켓의 입력스트림을 제공받아 대량의 문자데이타를 입력받을 수 있는 입력스트림 확장
BufferedReader in = new BufferedReader
(new InputStreamReader(socket.getInputStream()));
// 클라이언트의 소켓과 연결된 입력스트림을 이용하여 문자열(메세지)를 반환받아 출력
System.out.println("[" + socket.getInetAddress().getHostAddress()
+"]님이 보내온 메세지 = " + in.readLine());
socket.close();
}
} catch (IOException e) {
System.out.println("[에러]서버 네트워크에 문제가 발생 되었습니다.");
}
}
}
[메세지]Echo Server Running...
EchoCliectApp
import java.io.*;
import java.net.Socket;
// 키보드로 메세지를 입력받아 접속 서버에 전달하는 클라이언트 프로그램 작성
public class EchoCliectApp {
public static void main(String[] args) throws IOException {
// 키보드 입력스트림을 대량의 문자데이타를 입력받을 수 있는 입력스트림으로 확장
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("전달 메세지 입력 >> ");
String message = in.readLine();
try {
Socket socket=new Socket("192.168.13.31", 3000);
/*
// 소켓의 출력스트림을 제공받아 대량의 문자데이타를 전달할 수 있는 출력스트림으로 확장
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 서버의 소켓과 연결된 출력스트림을 이용하여 문자열(메세지) 전달
out.write(message);
// 출력스트림의 버퍼에 존재하는 문자데이타를 출력스트림으로 전달
out.flush();
*/
// 소켓의 출력스트림을 제공받아 모든 자료형의 값을 문자열로 변환하여 전달할 수 있는 기능의 출력스트림으로 확장
PrintWriter out = new PrintWriter(socket.getOutputStream());
// PrintWriter.println(Object o) : 매개변수로 전달받은 모든 자료형의 값(객체)를 문자열로 변환하여 전달하는 메소드
out.println(message);
out.flush();
socket.close();
} catch (IOException e) {
System.out.println("[에러]서버에 접속할 수 없습니다.");
}
}
}
전달 메세지 입력 >> 랄라
MessageSendApp
package xyz.itwill.net;
// UDP 프로그램 : DatagramSocket 클래스와 DatagramPacket 클래스를 이용하여 작성
// > 값을 전달하는 컴퓨터와 값을 전달받는 컴퓨터로 구분
// > 값을 전달하는 컴퓨터와 값을 전달받는 컴퓨터로 구분
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
// UDP 프로그램 : DatagramSocket 클래스와 DatagramPacket 클래스를 이용하여 작성
// > 값을 전달하는 컴퓨터와 값을 전달받는 컴퓨터로 구분하여 처리
// 키보드로 메세지를 입력받아 다른 컴퓨터에게 전달하는 UDP 프로그램 작성
public class MessageSendApp {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("전달 메세지 입력 >> ");
String message=in.readLine();
// DatagramSocket 클래스 : 다른 컴퓨터와 연결하기 위한 정보를 저장하기 위한 클래스
DatagramSocket socket = new DatagramSocket();
// 연결할 컴퓨터의 네트워크 식별자가 저장된 InetAddress 객체를 반환받아 저장
InetAddress address=InetAddress.getByName("192.168.13.31");
// String.getBytes() : String 객체에 저장된 문자열을 byte 배열로 변환하여 반환하는 메소드
byte[] data=message.getBytes();
// DatagramPacket 클래스 : 연결 컴퓨터에게 보낼 패킷정보를 저장하기 위한 클래스
// > DatagramPacket 클래스의 DatagramPacket(byte[] data, int length, InetAddress address, int port)
// 생성자를 사용하여 데이타를 보내기 위한 패킷정보가 저장된 DatagramPacket 객체 생성
DatagramPacket packet=new DatagramPacket(data, data.length, address, 4000);
// DatagramSocket.send(DatagramPacket packet) : 매개변수로 전달받은 DatagramPacket
// 객체의 패킷정보를 이용하여 데이타(패킷)를 전달하는 메소드
socket.send(packet);
// DatagramSocket.close() : DatagramSocket 객체를 제거하는 메소드
socket.close();
System.out.println("[결과]연결 컴퓨터에게 메세지를 보냈습니다.");
}
}
전달 메세지 입력 >> 왼손은 거들뿐
[결과]연결 컴퓨터에게 메세지를 보냈습니다.
MessageReceiveApp
package xyz.itwill.net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
// 다른 컴퓨터에서 보내온 메세지를 얻어와 출력하는 UDP 프로그램 작성
public class MessageReceiveApp {
public static void main(String[] args) throws IOException {
// 다른 컴퓨터에서 보내온 데이타를 전달받기 위한 DatagramSocket 객체 생성
// > DatagramSocket 클래스의 DatagramSocket(int port) 생성자를 사용하여 포트를 활성화 처리하여 DatagramSocket 객체 생성
DatagramSocket socket=new DatagramSocket(4000);
// 전달받은 값(메세지)을 저장하기 위한 byte 배열 선언
byte[] data=new byte[1024];
// 연결 컴퓨터에서 보내온 값을 byte 배열에 저장하기 위한 DatagramPacket 객체 생성
// > DatagramPacket 클래스의 DatagramPacket(byte[] buf, int length) 생성자를 이용하여 DatagramPacket 객체 생성
DatagramPacket packet = new DatagramPacket(data, data.length);
System.out.println("메세지 수신중...");
// DatagramSocket.receive(DatagramPacket packet) : 연결 컴퓨터에서 보내온 값을 얻어와 DatagramPacket 객체의 byte 배열에 저장하기 위한 메소드
// > 패킷을 받기 전까지 스레드 일시 중지
socket.receive(packet);
// byte 배열에 저장된 원시데이타를 문자열로 변환하여 저장
String message = new String(data);
System.out.println("[결과]메세지 = "+message);
socket.close();
}
}
메세지 수신중...