728x90

 

InetAddress

  - IP주소를 다루기 위한 클래스
 
import java.net.*;
import java.util.*;

public class Hello {

    public static void main(String[] args) {
        InetAddress ip = null;
        InetAddress[] ipArr = null;

        try{
            ip = InetAddress.getByName("www.daum.net");
            System.out.println("getHostName() :" + ip.getHostName());
            System.out.println("getHostAddress() :" + ip.getHostAddress());
            System.out.println("toString() :" + ip.toString());

            byte[] ipAddr = ip.getAddress();
            System.out.println("getAddress() :" + Arrays.toString(ipAddr));

            String result = "";
            for (int i=0; i < ipAddr.length; i++) {
                result += (ipAddr[i] < 0) ? ipAddr[i] + 256 : ipAddr[i];
                result += ".";
            }
            System.out.println("getAddress() + 256 :" + result);
            System.out.println();
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        }

        try{
            ip = InetAddress.getLocalHost();
            System.out.println("getHostName() :" + ip.getHostName());
            System.out.println("getHostAddress() :" + ip.getHostAddress());
            System.out.println();
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        }

        try{
            ipArr = InetAddress.getAllByName("www.daum.net");

            for (int i=0; i < ipArr.length; i++) {
                System.out.println("ipArr["+i+"]" + ipArr[i]);
            }
        }
        catch(UnknownHostException e){
            e.printStackTrace();    
        } 
    }
}

getHostName() :www.daum.net
getHostAddress() :117.52.2.25
toString() :www.daum.net/117.52.2.25
getAddress() :[117, 52, 2, 25]
getAddress() + 256 :117.52.2.25. 
getHostName() :KyleYui-MacBook-Pro.local
getHostAddress() :192.168.99.1 
ipArr[0]www.daum.net/117.52.2.25
ipArr[1]www.daum.net/61.111.62.165
 

URL 클래스

  - 객체 생성 : URL url = new URL("http://www.aaaa.com/sample/hello.html);
     URL( String spec )
     URL( string protocol , String host , String file)
     URL( string protocol , String host , int port, String file)

  - 메서드
   String getAuthority() 호스트명과 포트 문자열로 반환
   Object getContent() URL의 Content 객체 반환
   Object getContent(Class[] classes)  
   int getDefaultProt() URL 기본 포트 반환
   String getFile() 파일명 반환
   String getHost() 호스트명 반환
   String getPath() 경로명 반환
   String getPort() 포트 반환
   String getProtocol() 프로토콜 반환
   String getQuery() 쿼리 반환
   String getRef()  참조를 반환
   String getUserInfo 사용자 정보 반환
   URLConnection openConnection() URL과 연결된 URLConnection을 얻는다.
   URLConnection openConnection(Proxy proxy) 
   inputStream openStream() URL과 연결된 URLConnection의 inputStream을 얻는다.
   boolean sameFile(URL other) 두 URL이 서로 같은 것인지 알려준다.
   void set( String protocol, String host, int port, String file, String ref)
   void set( String protocol, String host, int port, String authority
             String userInfo , String path, String query, String ref) 설정
   String toExternalForm() URL을 문자열로 변환하여 반환한다.
   URI toURI() URL을 URI로 변환하여 반환
 

URLConnection 클래스

 - 데이터가 문자데이터이기 때문에 BefferedReader를 사용함
 
import java.net.*;
import java.io.*;

public class Ex16_4 {
	public static void  main(String args[]) {
		URL url = null;
		BufferedReader input = null;
		String address = "http:/ /www.codechobo.com/sample/hello.html";
		String line = "";

		try {
			url  = new URL(address);
			input=new BufferedReader(new InputStreamReader(url.openStream()));

			while((line=input.readLine()) !=null) {
				System.out.println(line);
			}
			input.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	} // main
}
 
import java.net.*;
import java.io.*;

public class Ex16_5 {
	public static void  main(String args[]) {
		URL url = null;
		InputStream in = null;
		FileOutputStream out = null;
	    String address = "http://www.codechobo.com/book/src/javabasic_src.zip";

		int ch = 0;

		try {
			url = new URL(address);
			in = url.openStream();
			out = new FileOutputStream("javabasic_src.zip");

			while((ch=in.read()) !=-1) {
				out.write(ch);
			}
			in.close();
			out.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	} // main
}
 

소켓 프로그래밍


  - 서버 프로그램을 종료 시키려면 윈도우의 경우 Ctrl + C 눌러서 강제종료
  - 서버 소켓 : 포트와 연결되어 외부의 연결요청을 기다리다가 연결요청이 들어오면,
                Socket을 생성해서 소켓과 소켓간 통신이 이루어 지도록 한다.
                ( 프로토콜이 다르면 포트를 공유 할 수 있다 )
  - 네트워크의 양방향 통신에서 양쪽 끝단으로, TCP/IP 단에서 구분할 수 있는
    하나의 포트 번호를 가진다.
  - 하나의 호스트가 65536개의 포트를 가지고 있으며, 보통 1023번 이하의 포트는 FTP, TELNET
    과 같은 다른 통신 프로그램에 의해 사용되는 경우가 많기에 1023 번 이상의 포트중에서
    사용하지 않는 포트를 골라서 쓰도록 한다.
  
  1. TCP 소켓 프로그래밍
  - ServerSocket  ↔ ClientSocket
    InputStream   ← OutputStream
    OutputStream  → InputStream
   
  2. UDP 소켓 프로그래밍
  - DatagramSocket -> DatagramPacket
    연결 지향 프로토콜이 아니기 때문에 ServerSocket이 불필요.
    UDP 통신에서 사용하는 소켓은 DatagramSocket 이며, DatagramPacket에 담아서 전송한다
    DatagramPacket 은 헤더와 데이터로 구성되어 있고,  헤더엔 수신할 호스트 정보가 저장된다
    그래서 DatagramPacket을 전송하면 DatagramPacket에 지정된 주소의 
    DatagramSocket 에 도착한다
 
=================   TCP/IP 서버 소켓 =================
import java.net.*;
import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;

public class TcpIpServer {
	public static void main(String args[]) {
		ServerSocket serverSocket = null;
		
		try {
			// 서버소켓을 생성하여 7777번 포트와 결합(bind)시킨다.
			serverSocket = new ServerSocket(7777);
			System.out.println(getTime()+"서버가 준비되었습니다.");
		} catch(IOException e) { e.printStackTrace(); }

		while(true) {
			try {
				System.out.println(getTime()+"연결요청을 기다립니다.");
				// 서버소켓은 클라이언트의 연결요청이 올 때까지 
                // 실행을 멈추고 계속 기다린다.
				// 클라이언트의 연결요청이 오면 클라이언트 소켓과 
                // 통신할 새로운 소켓을 생성한다.
				Socket socket = serverSocket.accept();
				System.out.println(getTime()+ socket.getInetAddress() 
                                            + "로부터 연결요청이 들어왔습니다.");
				// 소켓의 출력스트림
				OutputStream out = socket.getOutputStream();
				DataOutputStream dos = new DataOutputStream(out);

				// 원격 소켓(remote socket)에 데이터를 보낸다.
				dos.writeUTF("[Notice] Test Message1 from Server.");
				System.out.println(getTime()+"데이터를 전송했습니다.");

				// 스트림과 소켓을 닫아준다.
				dos.close();
				socket.close();
			} catch (IOException e) { 
				e.printStackTrace(); 
			}
		} // while
	} // main

	// 현재시간을 문자열로 반환하는 함수
	static String getTime() {  
		SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
		return f.format(new Date());
	}
} // class
 
=================   TCP/IP 클라이언트 소켓 =================
import java.net.*;
import java.io.*;

public class TcpIpClient {
	public static void main(String args[]) {
		try {
			String serverIp = "127.0.0.1";

			System.out.println("서버에 연결중입니다. 서버IP :" + serverIp);
			// 소켓을 생성하여 연결을 요청한다.
			Socket socket = new Socket(serverIp, 7777); 

			// 소켓의 입력스트림
			InputStream in = socket.getInputStream();
			DataInputStream dis = new DataInputStream(in);

			// 소켓으로 부터 받은 데이터를 출력한다.
			System.out.println("서버로부터 받은 메시지 :"+dis.readUTF());      
			System.out.println("연결을 종료합니다.");

			// 스트림과 소켓을 닫는다.
			dis.close();
			socket.close();
			System.out.println("연결이 종료되었습니다.");
		} catch(ConnectException ce) {
			ce.printStackTrace();
		} catch(IOException ie) {
			ie.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();  
		}  
	} // main
}
 

클라이언트가 DatagramPacket을 생성해서 DatagramSocket으로 서버에 전송하면,
서버는 전송받은 DatagramPacket 의 getAddress() , getPort()를 호출해서 
클라이언트의 정보를 얻어서 서버 시간을 DatagramPacket에 담아서 전송.

import java.net.*;
import java.io.*;

public class UdpClient {
	public void start() throws IOException, UnknownHostException {
		DatagramSocket datagramSocket = new DatagramSocket();
		InetAddress    serverAddress  = InetAddress.getByName("127.0.0.1");

		// 데이터가 저장될 공간으로 byte배열을 생성한다.
		byte[] msg = new byte[100];

		DatagramPacket outPacket =
                        new DatagramPacket(msg, 1, serverAddress, 7777);
		DatagramPacket inPacket = new DatagramPacket(msg, msg.length);

		datagramSocket.send(outPacket);    // DatagramPacket을 전송한다.
		datagramSocket.receive(inPacket);  // DatagramPacket을 수신한다.

		System.out.println("current server time :"
                                      + new String(inPacket.getData()));

		datagramSocket.close();
	} // start()

	public static void main(String args[]) {
		try {
			new UdpClient().start();
		} catch(Exception e) {
			e.printStackTrace();
		}
	} // main 
}
 
import java.net.*;
import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;

public class UdpServer {
	public void start() throws IOException {
		// 포트 7777번을 사용하는 소켓을 생성한다.
		DatagramSocket socket = new DatagramSocket(7777);
		DatagramPacket inPacket, outPacket;

		byte[] inMsg = new byte[10];
		byte[] outMsg;

		while(true) {
			// 데이터를 수신하기 위한 패킷을 생성한다.
			inPacket = new DatagramPacket(inMsg, inMsg.length);
			socket.receive(inPacket); // 패킷을 통해 데이터를 수신(receive)한다.

			// 수신한 패킷으로 부터 client의 IP주소와 Port를 얻는다.
			InetAddress address = inPacket.getAddress();
			int port = inPacket.getPort();

			// 서버의 현재 시간을 시분초 형태([hh:mm:ss])로 반환한다.			
			SimpleDateFormat sdf = new SimpleDateFormat("[hh:mm:ss]");
			String time = sdf.format(new Date());
			outMsg = time.getBytes(); // time을 byte배열로 변환한다.

			// 패킷을 생성해서 client에게 전송(send)한다.
			outPacket = new DatagramPacket(outMsg, outMsg.length, address, port);
			socket.send(outPacket);
		}
	} // start()

	public static void main(String args[]) {
		try {  
			new UdpServer().start();  // UDP서버를 실행시킨다.
		} catch (IOException e) {
			e.printStackTrace();
		}
	} // main
}
 

 

 

728x90

+ Recent posts