본문 바로가기

Java Programming/Java

[Java] 소켓통신(Socket)

소켓통신이란?

Socket : 프로세스간의 통신을 담당하며, InputStream과 OutputSteam을 가지고 있습니다. 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어집니다.

ServerSocket : 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 한 포트에 하나의 ServerSocket만 연결할 수 있습니다.(프로토콜이 다르면 같은 포트를 공유할 수 있습니다.)

ex)

1. Server

package insu.iims.batch;

import java.net.*;

import java.io.*;


public class EchoServer {


public static void main(String[] args) {


try {

// 1. 30184번 포트에서 동작하는 ServerSocket을 생성

ServerSocket server = new ServerSocket(30184);

System.out.println("Wating Connect ..");


// 2. ServerSocket의 accept() 메소드를 실행해서 클라이언트의 접속을 대기

// : 클라이언트가 접속할 경우 accept() 메소드는 Socket 객체를 반환

Socket sock = server.accept();

InetAddress inetaddr = sock.getInetAddress();

System.out.println(inetaddr.getHostAddress() + " 로부터 접속했습니다.");


// 3. 반환받은 Socket으로부터 InputStream과 OutputStream을 구함

OutputStream out = sock.getOutputStream();

InputStream in = sock.getInputStream();


// 4. InputStream은 BufferedReader 형식으로 변환

// OutputStream은 PrintWriter 형식으로 변환

PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));

BufferedReader br = new BufferedReader(new InputStreamReader(in));


String line = null;


// 5. BufferedReader의 readLine() 메소드를 이용해

// 클라이언트가 보내는 문자열 한 줄을 읽어들임

while ((line = br.readLine()) != null) {


System.out.println("클라이언트로부터 전송받은 문자열 : " + line);


// 6. PrintWriter의 println을 이용해 다시 클라이언트로 전송

//pw.println(line);

// 응답전문 전달

String fullText = "SAMPLETEXTEXT00519RN01506200";

pw.println(fullText);

pw.flush();


}


// 6. IO 객체와 소켓의 close() 메소드 호출

pw.close();

br.close();

sock.close();

server.close();


} catch (Exception e) {

System.out.println(e);

}

}

}


서버실행 : Run As - Java Application 실행(Ctrl+F11)

----------------------------------------------------------------------------------


2. Client


package insu.iims.batch;

import java.net.*;

import java.io.*;

public class EchoClient {


public static void main(String[] args) throws Exception {

//testClient();

String requestFullText ="my name is yunjae!";

String responsefullText = null;

responsefullText = getFullTextByKidi(requestFullText);

System.out.println("responsefullText >> "+responsefullText);

}

public static void testClient() {

try {

// 1. 서버의 IP와 서버의 동작 포트 값(10001)을 인자로 넣어 socket 생성

Socket sock = new Socket("127.0.0.1", 10001);

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));


// 2. 생성된 Socket으로부터 InputStream과 OutputStream을 구함

OutputStream out = sock.getOutputStream();

InputStream in = sock.getInputStream();


// 3. InputStream은 BufferedReader 형식으로 변환

// OutputStream은 PrintWriter 형식으로 변환

PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));


// 4. 키보드로부터 한 줄씩 입력받는 BufferedReader 객체 생성

BufferedReader br = new BufferedReader(new InputStreamReader(in));


String line = null;


// 5. 키보드로부터 한 줄을 입력받음

while ((line = keyboard.readLine()) != null) {

if (line.equals("quit"))

break;

// 6. PrintWriter에 있는 println() 메소드를 이용해 서버에게 전송

pw.println(line);

pw.flush();


// 7. 서버가 다시 반환하는 문자열을 BufferedReader에 있는

// readLine()을 이용해서 읽어들임

String echo = br.readLine();

System.out.println("서버로부터 전달받은 문자열 :" + echo);


}


pw.close();

br.close();

sock.close();


} catch (Exception e) {

System.out.println(e);

}

}

public static String getFullTextByKidi(String requestFullText) throws Exception {

String responsefullText = null;

// 서버의 IP와 서버의 동작 포트 값을 인자로 넣어 socket 생성(운영계 ip:127.0.0.1, port:30184)

//String serverIp = "127.0.0.1";

//int serverPort = 30184;

String serverIp = "127.0.0.1";

int serverPort = 30184;

          Socket sock = new Socket(serverIp, serverPort);

        

          // 생성된 Socket으로부터 InputStream과 OutputStream을 구함

          OutputStream out = sock.getOutputStream();

          InputStream in = sock.getInputStream();

       

          // OutputStream은 PrintWriter 형식으로 변환

          PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));


          // InputStream은 BufferedReader 형식으로 변환

          BufferedReader br = new BufferedReader(new InputStreamReader(in));

       

          System.out.println("보낼 문자열 : [" + requestFullText + "]");

        

          // PrintWriter에 있는 println() 메소드를 이용해 서버에게 전송

          pw.println(requestFullText);

          pw.flush();

       

          // 서버가 다시 반환하는 문자열을 BufferedReader에 있는 readLine()을 이용해서 읽어들임

          responsefullText = br.readLine();

          System.out.println("서버로부터 전달받은 문자열 : [" + responsefullText + "]");

       

          pw.close();

          br.close();

          sock.close();

return responsefullText;

}


}




'Java Programming > Java' 카테고리의 다른 글

Template Method 패턴  (1) 2018.07.17
Synchronous vs Asynchronous  (0) 2018.02.13
[JAVA] 소켓 프로그래밍[펌]  (0) 2014.07.07
[펌]소켓통신  (0) 2014.07.07
[JAVA]HashMap 클래스  (0) 2014.03.27