본문 바로가기

자바

소켓

1. 서버 소켓

서버 소켓은 네트워크상에서 요청이 올 때까지 기다리는 소켓이다. 클라이언트측에서 소켓을 생성하면 호스트 이름과 포트 번호에 해당하는 서버 소켓에 접속이 요청되고, 서버 소켓은 접속을 허가해 준다. 다음은 서버 소켓의 형식이다.

ServerSocket myServerSocket = new ServerSocket(2587);

클래스이름    변수                              포트번호

 

서버 소켓에서 클라이언트가 접속해 올 때까지 기다릴 때는 accept() 메소드를 사용한다. accept() 메소드는 접속해 온 클라이언트의 Socket 객체를 돌려준다. 따라서 myServer에 접속하는 클라이언트의 소켓을 얻고 싶을 땐 다음처럼...

Socket mySocket = myServerSocket.accept();

 

다음은 클라이언트의 접속을 기다리는 서버 소켓의 예제이다.

package ch04;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
	public static void main(String[] args) {
		try {
			ServerSocket myServerSocket = new ServerSocket(8080);
			System.out.println("클라이언트가 접속하길 기다리고 있습니다.");
			
			Socket mySocket = myServerSocket.accept();
			System.out.println("클라이언트가 접속했습니다.");
			
			BufferedReader in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(mySocket.getOutputStream()));
			
			System.out.println("클라이언트로부터 받은 메시지 : " + in.readLine());
			String msg = "### 접속을 허락합니다.";
			out.println(msg);
			out.flush();
			System.out.println("클라이언트에게 보낸 메시지 : " + msg);
			
			mySocket.close();
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
}

 

2. 소켓

소켓은 클라이언트 측에서 서버에 접속하여 통신을 시작하는 역할을 한다. 소켓은 클라이언트에서 서버 소켓에 접속할 때 주로 사용하지만, 서버에서도 접속된 클라이언트를 다루기 위해 사용하므로 클라이언트 소켓이라고 하지 않고, 그냥 소켓이라고 한다. 다음은 소켓의 형식이다.

Socket mySocket = new Socket("https://www.naver.com", 8080);
클래스이름 변수                URL                    포트번호

 

클라이언트 측에서 호스트 이름과 포트 번호를 인수로 줘서 소켓을 생성하면, 해당 서버와 TCP를 기반으로 데이터 전달이 가능한 입출력 스트림을 만들 수 있다. 입력 스트림을 만들 때는 getInputStream() 메소드를 사용해서 InputStream을 얻는다. 이 InputStream을 통해 서버로부터 오는 데이터를 받을 수 있다. mySocket이 접속된 서버로부터 오는 한 라인의 데이터를 얻고 싶을 때는 다음처럼...

BufferedReader in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
String str = in.readLine();

 

반대로 클라이언트에서 서버로 데이터를 보낼 때는 getOutputStream() 메소드로 얻는 OutputStream에 출력하면 된다. mySocket이 접속된 서버에 "안녕!"이라는 문자열을 보내고 싶으면 다음처럼...

PrintWriter out = new PrintWriter(new OutputStreamWriter(mySocket.getOutputStream()));
out.println("안녕!");

 

다음은 서버 소켓과 접속하여 데이터를 주고 받는 예제이다.

package ch04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTest {
	public static void main(String[] args) {
		try {
			Socket mySocket = new Socket("192.168.1.107", 8080);
			System.out.println("서버에 접속했습니다.");
			
			BufferedReader in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(mySocket.getOutputStream()));
			
			String msg = "%%% 접속을 허락해 주세요.";
			System.out.println("서버에게 보낸 메시지 : " + msg);
			out.println(msg);
			out.flush();
			System.out.println("서버로부터 받은 메시지 : " + in.readLine());
			
			mySocket.close();
			
		} catch (UnknownHostException e) {
			System.out.println(e.toString());
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}

'자바' 카테고리의 다른 글

오버라이딩  (0) 2020.10.11
상속  (0) 2020.10.11
URL 클래스  (0) 2020.09.06
출력 스트림  (0) 2020.09.06
입력 스트림  (0) 2020.09.06