빅데이터교육과정/JAVA

DAY13. 네트워크 통신(TCP, 유니캐스트)

Listeria 2021. 2. 23. 02:54
import java.io.*; 
import java.net.*; 
public class EchoClient { 
	private String ip; 
	private int port; 
	private String str; 
	BufferedReader file; 
	
	public EchoClient(String ip, int port) throws IOException { 
		this.ip = ip; 
		this.port = port; 
		
		Socket tcpSocket = getSocket(); 
		
		OutputStream os_socket = tcpSocket.getOutputStream(); 
		InputStream is_socket = tcpSocket.getInputStream(); 

		BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(os_socket)); 
		BufferedReader bufferR = new BufferedReader(new InputStreamReader(is_socket)); 
		System.out.print("입력 : "); 
	
		file = new BufferedReader( 	new InputStreamReader(System.in)); 
		
		str = file.readLine(); 
		str += System.getProperty("line.separator"); 
		bufferW.write(str); 
		bufferW.flush(); 
		str = bufferR.readLine(); 
		System.out.println("Echo Result : " + str); 

		file.close(); 
		bufferW.close(); 

		bufferR.close(); 
		tcpSocket.close(); 
	} 
	public Socket getSocket() { 
		Socket tcpSocket = null; 
		try { 
			tcpSocket = new Socket(ip, port); 
		} catch (IOException ioe) { 
			ioe.printStackTrace(); 
			System.exit(0); 
		} 
		return tcpSocket; 
	} 
	public static void main(String[] args) throws IOException { 
		new EchoClient("localhost", 3000); 
	} 
} ​

 

import java.net.*;
public class InetEx {

	public static void main(String[] args) throws UnknownHostException{
		
		
		InetAddress iaddr = InetAddress.getLocalHost();
		System.out.printf("host name : %s %n",iaddr.getHostName());
		System.out.printf("host ip :%s %n ", iaddr.getHostAddress());
		
		iaddr = InetAddress.getByName("www.naver.com");
		System.out.printf("host name : %s %n",iaddr.getHostName());
		System.out.printf("host ip :%s %n ", iaddr.getHostAddress());
		
		InetAddress sw[] = InetAddress.getAllByName("df.nexon.com");
		for(InetAddress temp_sw:sw) {			
			System.out.printf("host name : %s %n",temp_sw.getHostName());
			System.out.printf("host ip :%s %n ", temp_sw.getHostAddress());
		}
	}

}

 

import java.io.*; 
import java.net.*; 
public class EchoServer{ 
	private BufferedReader bufferR; 
	private BufferedWriter bufferW; 
	private InputStream is; 
	private OutputStream os; 
	private ServerSocket serverS; 
	public EchoServer(int port){ 
		try{ 
			serverS = new ServerSocket(port); 
		}catch(IOException ioe){ 
			ioe.printStackTrace(); 
			System.exit(0); 
		} 
		while(true){ 
			try{ 
				System.out.println("클라이언트의 요청을 기다리는 중"); 
				Socket tcpSocket = serverS.accept(); 
				
				System.out.println("클라이언트의 IP 주소 : "+ 
						tcpSocket.getInetAddress().getHostAddress()); 
				
				is = tcpSocket.getInputStream(); 
				os = tcpSocket.getOutputStream(); 
				
				bufferR = new BufferedReader(new InputStreamReader(is)); 
				bufferW = new BufferedWriter(new OutputStreamWriter(os)); 
				
				String message = bufferR.readLine(); 
				System.out.println("수신메시지 : "+ message); 
				message += System.getProperty("line.separator"); 
				
				bufferW.write(message); 
				bufferW.flush(); 
				bufferR.close(); 
				bufferW.close(); 
				tcpSocket.close(); 
			}catch(IOException ioe){ 
				ioe.printStackTrace(); 
			} 
		} 
	} 
	public static void main(String[] args){ 
		new EchoServer(3000); 
	} 
} 

TCP 통신의 기본은 서버가 서버 소켓을 생성하고 클라이언트가 소켓을 만들어서 이 연결을 통해 통신이 이루어 지게 된다.


import java.io.*; 
import java.net.*; 
public class UnicastServer{ 
//	private BufferedReader bufferR; 
//	private BufferedWriter bufferW; 
//	private InputStream is; 
//	private OutputStream os; 
	private ServerSocket serverS; 
	Socket s;
	public UnicastServer(int port){ 
		try{ 
			serverS = new ServerSocket(port); 
		}catch(IOException ioe){ 
			ioe.printStackTrace(); 
			System.exit(0); 
		}  
		
		while(true) {
			System.out.println("client ready");
			try {
				s = serverS.accept();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.out.println("client ip "+s.getInetAddress().getHostAddress());
			UnicastServerThread ust = new UnicastServerThread(s);
			Thread Uni = new Thread(ust);		
			Uni.start();
		}
		
	} 
	public static void main(String[] args){ 
		new UnicastServer(3000); 
	} 
} 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UnicastServerThread implements Runnable{

	private BufferedReader bufferR; 
	private BufferedWriter bufferW; 
	private InputStream is; 
	private OutputStream os; 

	Socket tcpSocket;

	public UnicastServerThread(Socket s){ 
		tcpSocket = s;
	} 
	public void outThread() {
		boolean isStop = false;
		while(!isStop) {

			try{ 

				os = tcpSocket.getOutputStream(); 
				is = tcpSocket.getInputStream(); 

				bufferR = new BufferedReader(new InputStreamReader(is)); 
				bufferW = new BufferedWriter(new OutputStreamWriter(os)); 

			}catch(IOException ioe){
				ioe.printStackTrace(); 
				isStop=true;
			}
			try {
				while(!isStop) {
					String message = bufferR.readLine(); 
					System.out.println("수신메시지 : "+ message); 
					message += System.getProperty("line.separator"); 

					bufferW.write(message); 
					bufferW.flush(); 
				}
			}catch(IOException ioe){
				System.out.println("End2");
				isStop=true;
			}
			finally {
				try {
					bufferR.close(); 
					bufferW.close(); 
					tcpSocket.close();
				} catch (IOException e) {
					e.printStackTrace();
				} 
			}
		}
	}

	public void run() {
		outThread();


	}

}
import java.io.*; 
import java.net.*; 
public class UnicastClient { 
	private String ip; 
	private int port; 
	private String str; 
	BufferedReader file=null; 
	BufferedWriter bufferW=null; 
	BufferedReader bufferR; 


	public UnicastClient(String ip, int port) throws IOException { 
		Socket tcpSocket;
		OutputStream os_socket; 
		InputStream is_socket;
		this.ip = ip; 
		this.port = port; 
		tcpSocket = getSocket(); 
		boolean isStop=false;
		os_socket = tcpSocket.getOutputStream(); 
		is_socket = tcpSocket.getInputStream(); 
		bufferW = new BufferedWriter(new OutputStreamWriter(os_socket)); 
		bufferR = new BufferedReader(new InputStreamReader(is_socket)); 


		while(!isStop) {
			System.out.print("입력 : "); 
			file = new BufferedReader(new InputStreamReader(System.in)); 

			str = file.readLine(); 
			str += System.getProperty("line.separator"); 
			bufferW.write(str); 
			bufferW.flush(); 
			str = bufferR.readLine();
			if(str.equals("exit")) {
				isStop=true;
				System.out.println("End" );}
			else {
				System.out.println("r.m : "+str);	}
		} 
		file.close(); 
		bufferW.close(); 
		bufferR.close(); 
		tcpSocket.close(); 

	} 


	public Socket getSocket() { 
		Socket tcpSocket = null; 
		try { 
			tcpSocket = new Socket(ip, port); 
		} catch (IOException ioe) { 
			ioe.printStackTrace(); 
			System.exit(0); 
		} 
		return tcpSocket; 
	}


	public static void main(String[] args) throws IOException { 

		new UnicastClient("localhost", 3000); 		

	} 
} 

 

유니캐스트는 Tcp 소켓을 스레드를 통해 동작시켜 통신이 한번 이루어진뒤에 다시 통신을 이어갈 수 있다. 즉 클라이언트와 서버간에 지속적으로 통신이 유지되게 된다.