본문 바로가기
Programming/Java

Java / Networking / 소켓( socket ) 통신 프로그래밍

by with chu 2021. 3. 27.
728x90

소켓( socket ) 통신


 

소켓(socket)은 통신선 또는 전기선, 네트워크에 접속하게 하는 연결부를 뜻한다.
소켓 프로그래밍은 클라이언트(client)와 서버(server)가 통신할 수 있는 환경을 설계하는것이다.

 

소켓( socket ) 통신 순서

 

클라이언트가 서버와 통신을 할 때, 그 서버의 특정 application 에 접근을 하기위해서는 소켓을 거쳐서 특정 port와 연결이 된다. 이러한 소켓 안에서 어떠한 방식으로 통신 할 것인지 설계하는 것이 소켓프로그래밍이다.

1:1 통신이 아니라 여러 클라이언트가 접속할때는 클라이언트에게 서비스를 제공하는 컴퓨터(ServerSocket) 안에 읽고쓰는 Thread(스레드)가 클라이언트의 port, socket 개수만큼 존재하여 동시에 통신할 수 있게 한다.

getInputStream() 메소드는 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성하는 것이다.
getOutputStream() 메소드는 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성하는 것이다.

 


 

예시로 콘솔창에 메세지로 통신하는 서버와 클라이언트 코드를 보도록하자.

한줄씩 해석은 주석으로 설명하였다.

 

파일명 : MyNetServer02.java

package networktest;

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

public class MyNetServer02 {

	public static void main(String[] args) {
		Socket client = null;
		InputStream is = null; //클라이언트와 input통신을 할수있는 스트림(IO)
		DataInputStream dis = null; //최종적으로 클라이언트와 통신
		
		OutputStream os = null; //클라이언트와 output통신을 할수있는 스트림(IO)
		DataOutputStream dos = null; //최종적으로 클라이언트와 통신
		try {
			ServerSocket server = new ServerSocket(12345);
			System.out.println("ServerSocket준비완료..클라이언트의 접속을 기다림");
			// 대기하다가 (Listen) 클라이언트 접속하면 클라이언트정보를 Socket객체로 만들어서 리턴
			while (true) {
				client = server.accept();
				//클라이언트가 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성
				is = client.getInputStream();
				dis = new DataInputStream(is);
				//클라이언트로 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성
				os = client.getOutputStream();
				dos = new DataOutputStream(os);
				//여기까지가 준비 작업
				
				
				// 1. server => client 
				//순서가 중요 - thread돌리는게 아니라서 output 2번하면 client에서도 똑같이 input 2번
				dos.writeUTF(client.getInetAddress().getHostAddress()+"님 접속을 환연합니다.");
				dos.writeInt(20000);
				
				// 2. server <= client
				String clientMsg = dis.readUTF();
				System.out.println("클라이언트가 전송한 데이터 : "+clientMsg);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

파일명 : MyNetClient02.java

package networktest;

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

public class MyNetClient02 {

	public static void main(String[] args) {
	//서버와 통신할 수 있는 Socket만들고 서버접속
		Socket server = null;
		InputStream is = null; //서버와 input통신을 할수있는 스트림(IO)
		DataInputStream dis = null; //최종적으로 서버와 통신
		
		OutputStream os = null; //서버와 output통신을 할수있는 스트림(IO)
		DataOutputStream dos = null; //최종적으로 서버와 통신
		try {
			server = new Socket("192.168.35.61",12345); //cmd에서 ipconfig찍으면 나오는 내IP
			
			//서버가 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성
			is = server.getInputStream();
			dis = new DataInputStream(is);
			//서버로 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성
			os = server.getOutputStream();
			dos = new DataOutputStream(os);
			//여기까지가 준비 작업
			
			
			// 1.client <= server 서버가 전송한 데이터 읽기 
			//순서가 중요 - thread돌리는게 아니라서 output 2번하면 client에서도 똑같이 input 2번
			String UTFMsg = dis.readUTF();
			System.out.println("서버가 전송한 데이터 1: "+UTFMsg);
			int intMsg = dis.readInt();
			System.out.println("서버가 전송한 데이터 2: "+intMsg);
			
			// 2. client => server 클라이언트에서 서버로 전송
			dos.writeUTF("안녕하세요 서버님 클라이언트입니다.");
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

728x90

댓글