본문 바로가기
Study/Java

[Java] 네트워킹 (Socket, 양방향 통신)

by JYHAN 2020. 7. 4.

네트워크 데이터 입력 및 출력

네트워크 대상(객체) 사이에 입/출력(InputStream, OutputStream)을 이용해서 데이터를 입력하고 출력한다

네트워크 데이터 입출력

 

소켓(Socket)

네트워크상에서 데이터를 주고받기 위한 장치

서로 다른 겍체들간에 네트워크로 연결된 상태에서 입/출력을 하기 위한 장치를 소켓이라고 한다

네트워크 소켓

Socket 클래스

서버는 클라이언트를 맞을 준비를 하고 있다가 클라이언트의 요청에 반응한다

서버 & 클라이언트 - 소켓

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

public class MainClass {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
		serverSocket = new ServerSocket(9000); // 포트번호 9000번
		System.out.println("클라이언트 맞을 준비 완료!!");
		
		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();
			}
		}
	}
}

---- result ----
클라이언트 맞을 준비 완료!!
클라이언트 연결!!
socket: Socket[addr=/0:0:0

 

Client와 Server 소켓(Socket)

서버에서 SeverSocket을 준비하고 클라이언트에서 Socket를 이용해서 접속한다

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
			serverSocket = new ServerSocket(9000);
			System.out.println("클라이언트 맞을 준비 완료!!");
			
			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.net.Socket;

public class Client {
	public static void main(String[] args) {
		Socket socket = null;
		
		try {
			socket = new Socket("localhost", 9000); // 127.0.0.1 : localhost
			System.out.println("서버 연결!!");
			System.out.println("socket: "+socket);
		} catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(socket != null) socket.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

양방향 통신

클라이언트와 서버는 InputStream, OutputStream을 이용해서 양방향 통신을 할 수 있다

 

public class Server {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		InputStream inputStream = null;
		DataInputStream dataInputStream = null;
		
		OutputStream outputStream = null;
		DataOutputStream dataOutputStream = null;
		
		try {
			serverSocket = new ServerSocket(9000);
			System.out.println("클라이언트 맞을 준비 완료!!");
			
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결!!");
			System.out.println("socket: "+socket);
			
			inputStream = socket.getInputStream();
			dataInputStream = new DataInputStream(inputStream);
			
			outputStream = socket.getOutputStream();
			dataOutputStream = new DataOutputStream(outputStream);
			
			while(true) {
				String clientMessage = dataInputStream.readUTF();
				System.out.println("clientMessage : "+clientMessage);
				
				dataOutputStream.writeUTF("메시지 전송 완료!!!");
				dataOutputStream.flush();
				
				if(clientMessage.equals("STOP")) {
					System.out.println("서버를 종료합니다");
					break;
				}
			}
		} catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(socket != null) socket.close();
				if(serverSocket != null) serverSocket.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}
public class Client {
	public static void main(String[] args) {
		Socket socket = null;
		
		OutputStream outputStream = null;
		DataOutputStream dataOutputStream = null;
	
		InputStream inputStream = null;
		DataInputStream dataInputStream = null;
		
		Scanner scanner = null;
		
		try {
			socket = new Socket("localhost", 9000); // 127.0.0.1 : localhost
			System.out.println("서버 연결!!");

			outputStream = socket.getOutputStream();
			dataOutputStream = new DataOutputStream(outputStream);
			
			inputStream = socket.getInputStream();
			dataInputStream = new DataInputStream(inputStream);
			
			scanner = new Scanner(System.in);
			
			while(true) {
				System.out.println("메시지 입력!!");
				String outMessage = scanner.nextLine();
				dataOutputStream.writeUTF(outMessage);
				dataOutputStream.flush();
				
				String inMessage = dataInputStream.readUTF();
				System.out.println("inMessage : "+ inMessage);
				
				if(outMessage.contentEquals("STOP")) break;
			}
			
		} catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(socket != null) socket.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

댓글