본문 바로가기
Java

[Java] 네트워킹

by happyhelen 2021. 8. 17.

InputStream, OutputStream을 이용해서 네트워크상의 대상 사이의 데이터를 입력하고 출력한다

이때 네트워크상에서 데이터를 주고받기 위한 장치인 소켓(Socket)을 이용한다

Java에서는 Socket 클래스를 제공한다

 


실행순서 : 서버 -> 클라이언트

 

 

서버소켓

import java.net.ServerSocket;
import java.net.Socket;
// 서버 소켓 만든 후 브라우저로 접속
public class No18_Socket {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
        
		// 네트워크 관련된건 try구문 안에 넣어야 한다
		try {
			
			serverSocket = new ServerSocket(9000);// 서버소켓 생성(포트번호)
			System.out.println("클라이언트 맞이할 준비됨");
			
            //클라이언트소켓은 accpet메소드를 통해 서버소켓을 받음(연결)
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결됨");
			System.out.println("socket : "+ socket);
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(socket != null) socket.close();
				if(serverSocket != null) serverSocket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}

 

클라이언트 소켓

import java.io.IOException;
import java.net.Socket;

public class No18_ClientSocket {

	public static void main(String[] args) {
		// 클라이언트소켓 만들기
		Socket socket = null;
		
		try {
			socket = new Socket("localhost", 9000); // 로컬호스트의 ip주소 = 127.0.0.1
			System.out.println("서버 연결됨");
			System.out.println("socket: "+socket);
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(socket != null) socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

 

 


Stream 이용해서 데이터 주고받기

 

실행순서 : 서버 -> 클라이언트

 

서버소켓

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class No18_ServerSocket_Stream {

	public static void main(String[] args) {
    
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		InputStream inputS = null;
		DataInputStream dataInputS = null;
		OutputStream outputS = null;
		DataOutputStream dataOutputS = null;
		
		try {
			serverSocket = new ServerSocket(9001);
			System.out.println("클라이언트 맞이할 준비됨");
			
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결");
			System.out.println("socket : "+socket);
			
			inputS = socket.getInputStream();
			dataInputS = new DataInputStream(inputS);
			
			outputS = socket.getOutputStream();
			dataOutputS = new DataOutputStream(outputS);
			
			while(true) {
            	// 클라이언트소켓에서 데이터 읽어오는 input
				String clientMsg = dataInputS.readUTF();
				System.out.println("clientMsg : "+ clientMsg);
				
                // 클라이언트쪽으로 데이터 out
				dataOutputS.writeUTF("메세지 전송 완료"); 
				dataOutputS.flush(); // 확실하게 비우기
				
				if(clientMsg.equals("STOP")) break;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(dataInputS != null) dataInputS.close();
				if(inputS != null) inputS.close();
				if(dataOutputS != null) dataOutputS.close();
				if(outputS != null) outputS.close();
				
				if(socket != null) socket.close();
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

}

 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class No18_ClientSocket_Stream {

	public static void main(String[] args) {
		Socket socket = null;
		
		OutputStream outputS = null;
		DataOutputStream dataOutputS = null;
		InputStream inputS = null;
		DataInputStream dataInputS = null;
		
		Scanner sc = null;
		
		try {
			socket = new Socket("localhost", 9001);
			System.out.println("서버 연결됨");
			
            // 소켓에서 서버소켓으로 out 할때
			outputS = socket.getOutputStream();
			dataOutputS = new DataOutputStream(outputS);// 확장
			
            // 서버소켓에서 소켓으로 in 할때
			inputS = socket.getInputStream();
			dataInputS = new DataInputStream(inputS); // 확장
			
			sc = new Scanner(System.in);
			
			while(true) {
				System.out.println("메세지를 입력하세요:");
				String outMsg = sc.nextLine();
				dataOutputS.writeUTF(outMsg); // outMsg를 서버쪽으로 out
				dataOutputS.flush(); // 완벽하게 비워주기
				
				String inMsg = dataInputS.readUTF(); // 서버로부터 데이터 읽어오기
				System.out.println("inMsg : " + inMsg);
				
				if(outMsg.equals("STOP")) break;
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(dataOutputS != null) dataOutputS.close();
				if(outputS != null) outputS.close();
				if(dataInputS != null) dataInputS.close();
				if(inputS != null) inputS.close();
				
				if(socket != null) socket.close();
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}