IT/Java

[Java] Socket 통신 샘플 소스

상짱 2022. 10. 6. 15:23
반응형

- Socket 통신 샘플 소스

- 소스 설명은 주석 참조

package sample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketSample {

	public static void client( int port ) throws UnknownHostException, IOException {

		while( true ) {

			// 1. 키보드 입력 대기 상태(입력이벤트 LOCK)
			BufferedReader br = new BufferedReader( new InputStreamReader( System.in ));

			String msg = br.readLine();
			byte[] bMsg = msg.getBytes();

			// 2. 매개변수 포트로 소켓을 생성 및 연결한다.
			Socket socket = new Socket("127.0.0.1", port);

			// 3. 생성된 소켓으로 메시지를 보낸다.
			OutputStream os = socket.getOutputStream();
			os.write(bMsg);
			os.flush();
			System.out.println("[client send]:" + new String(bMsg));

			// 4. 생성된 소켓으로 메시지를 읽는다.
			InputStream is = socket.getInputStream();
			bMsg = new byte[1024];
			is.read(bMsg);
			String read = new String(bMsg).trim();
			System.out.println("[client recv]:" + read);

			// 대문자 Q 값이 들어오면 종료한다.
			if( "Q".equals( msg)) {
				socket.close();
				System.out.println("[client exit]");
				break;
			}
		}

	}

	public static void server( int port ) throws IOException {

		System.out.println("[server start]:[port]:"+ port);

		// 1. 별도의 프로세스(쓰레드)로 서버를 기동한다.
		new Thread(()->{
			try {

				// 2. 매개변수 포트로 서버소켓을 생성한다.
				ServerSocket ss = new ServerSocket( port );

				while( true ) {

					// 3. 소켓 접속 대기 상태(접속이벤트 LOCK)
					Socket socket = ss.accept();
					System.out.println("[ServerSocket connected]:" + socket.isConnected());

					// 4. socket 에 작성된 내용을 읽는다.
					InputStream is = socket.getInputStream();
					byte[] bMsg = new byte[1024];
					is.read(bMsg);
					String read = new String(bMsg).trim();
					System.out.println("[server recv]:" + read);

					// 5. 서버 응답 메시지를 작성한다.
					String msg = "[i am server]:".concat(read);
					bMsg = msg.getBytes();

					// 6. 서버 메시지를 클라이언트로 보낸다.
					OutputStream os = socket.getOutputStream();
					os.write(bMsg);
					os.flush();
					System.out.println("[server send]:" + new String(bMsg));
					//ss.close();

					// 대문자 Q 값이 들어오면 종료한다.
					if( "Q".equals( read)) {
						socket.close();
						ss.close();
						System.out.println("[server exit]");
						break;
					}
				}

			}catch(IOException e) {
				e.printStackTrace();
			}
		}).start();

	}

	public static void main(String...strings) throws Exception {

		final int port = 60040;

		// 1. 소켓서버 기동함
		SocketSample.server( port );

		// 2. 클라이언트 호출
		SocketSample.client( port );
	}
}

 

- 소스 테스트 결과

샘플 소스 테스트 결과

 

- 큰 틀에서의 설명을 하자면, Socket 의 Input/Output 스트림을 통해서 서버와 데이터를 주고 받는 것으로 이해하면 편하다.

- 자바 IO 관련 개념도 필요한 부분이다.

- 1바이트 IO : ~Stream 클래스

- 2바이트 IO : ~Reader/Writer 클래스

 

 

반응형