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());
}
}
}