본문 바로가기
Language/Java

자바 소켓 통신 서버와 클라이언트간 메세지 주고받기

by wakestand 2019. 12. 18.
반응형
 

자바 소켓 통신 서버 & 클라이언트 작성 및 연결해보기

자바로 소켓 통신 구현의 첫 번째 과제는 서버와 클라이언트를 연결하는 것인데 먼저 서버와 클라이언트를 작성해 서버와 클라이언트를 연결시켜 보자 먼저 위는 소켓 통신의 서버로 사용할 코드인데 Port 정보를..

wakestand.tistory.com

이전 글에서는 서버와 클라이언트를 만든 뒤 연결을 해 봤었는데

 

이제는 서버와 클라이언트 간 메세지를 주고 받아보자

 

먼저 서버로 사용할 MySocketServer 자바 파일인데

이전과 다른점은 Socket을 사용하게 위해 Socket 타입의 SocketUser를 상단에 선언했고

클라이언트가 accept() 시 socketUser에 해당 정보를 받게 된다

 

이후 InputStream과 BufferedReader를 사용해서

InputStream 안에 클라이언트의 InputStream 정보를 받고

BufferedReader 안에 InputStream 정보를 넣어서 클라이언트가 보낸 값을 가져온다

 

reader.readLine()을 사용하면 클라이언트가 보낸 값이 있을 경우 가져올 수 있다

(클라이언트가 2번 보냈을 경우, readLine도 2번 필요함)

 

다음은 서버에서 클라이언트를 보내는 경우인데

OutputStream과 PrintWriter를 이용해서

OutputStream안에 클라이언트의 OutputStream 정보를 받고

PrintWriter 안에 OutputStream 정보를 넣어서 클라이언트에 값을 보내준다

 

writer.println("값"); 으로 클라이언트에 값을 보내주게 된다

 

다음으로는 클라이언트의 역할을 하는 MySocketClient 자바 파일인데

보면 동일하게 OutputStream, PrintWriter, InputStream, BufferedReader를 사용해서

메세지를 주고 받는 것을 볼 수 있다

 

OutputStream은 보낼때

InputStream은 받을때 라고 생각하면 된다

 

예제에 사용한 전체 코드는 아래와 같다

 

 

// 서버
public class MySocketServer {
	
	public static void main(String[] args) {
		try {
			int socketPort = 1234;
			ServerSocket serverSocket = new ServerSocket(socketPort); // 소켓 만들기
			Socket socketUser = null; // 클라이언트 접속시 사용할 Socket
			System.out.println("socket : " + socketPort + "으로 서버가 열렸습니다");
			
                        // 소켓 서버가 종료될 때까지 반복
                        while(true) {

                            socketUser = serverSocket.accept(); 
                            // 소켓 서버로 접속 시 socketUser에 접속자 정보 할당
                            System.out.println("Client가 접속함 : " + socketUser.getLocalAddress()); 
                            // 접속자의 getLocalAddress 가져오기

                            // InputStream - 클라이언트에서 서버로
                            InputStream input = socketUser.getInputStream(); 
                            // socket의 InputStream 정보를 InputStream in에 넣은 뒤
                            BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
                            // BufferedReader에 위 InputStream을 담아 사용

                            System.out.println(reader.readLine()); 
                            // 클라이언트에서 온 메세지 확인

                            // OutputStream - 서버에서 클라이언트로
                            OutputStream out = socketUser.getOutputStream(); 
                            // socket의 OutputStream 정보를 OutputStream out에 넣은 뒤
                            PrintWriter writer = new PrintWriter(out, true); 
                            // BufferedReader에 위 InputStream을 담아 사용

                    	    writer.println("SERVER TO CLIENT"); 
                            // 서버에서 클라이언트로 메세지 보내기
                
                        }			
            
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

 

// 클라이언트
public class MySocketClient {

	public static void main(String[] args) {
		try {
			Socket socket = new Socket("121.153.255.53", 1234); // 소켓 서버에 접속 
			System.out.println("socket 서버에 접속 성공!");
			
                        // OutputStream - 클라이언트에서 Server로 메세지 발송
                        OutputStream out = socket.getOutputStream(); 
                        // socket의 OutputStream 정보를 OutputStream out에 넣은 뒤 
                        PrintWriter writer = new PrintWriter(out, true); 
                        // PrintWriter에 위 OutputStream을 담아 사용

                        writer.println("CLIENT TO SERVER"); 
                        // 클라이언트에서 서버로 메세지 보내기

                        // InputStream - Server에서 보낸 메세지 클라이언트로 가져옴
                        InputStream input = socket.getInputStream(); 
                        // socket의 InputStream 정보를 InputStream in에 넣은 뒤
                        BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
                        // BufferedReader에 위 InputStream을 담아 사용

                        System.out.println(reader.readLine()); 
                        // 서버에서 온 메세지 확인
                        System.out.println("CLIENT SOCKET CLOSE");
                        socket.close(); // 소켓 종료
            
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
반응형

댓글