네트워크와 쓰레드(Thread)

 

    다음코드는 쓰래드 인터페이스를 구현한 클래스를 이용하여 서버와 클라이언트간 Socket통신을 통하여 메시지를 교환하는 코드이다.

    클라이언트는 서버로 메시지를 전송하면 서버는 하나의 클라이언트들로 부터 받은 메시지를 접속된 모든 클라이에게 다시 전송하는

    프로그램이다. 

 

서버 프로그램 : SocketServer.java

package server;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.Iterator;

 

/**

 * 소켓 통신하기위한 기본 서버 프로그램.

 * @author JSMIN */

public class SocketServer implements Runnable {

         final static int SOCKET_SERVER_PORT = 5000;

         BufferedReader reader;

 

         // 클라이언가 접속할때마다 해당하는 출력스트림을 저장하기위한 배열.

         static ArrayList<PrintWriter> clientOutputStreams;

 

         // 클라이언트 요청에의해 생성된 소켓을이용하여 BufferedReader 객체를 생성한다.

         public SocketServer(Socket clientSocket) {

                  try {   InputStreamReader isReader = new InputStreamReader(

                                                              clientSocket.getInputStream());

                           reader = new BufferedReader(isReader);

 

                  } catch (IOException e) {

                           e.printStackTrace();

                  }

         }

 

         /* *

          * 별도의 실행스텍에서 실행되게 하기위한 메소드 구현 Runnable 인터페이스를 구현한 메소드.

          * @see java.lang.Runnable#run()  

          */

         @Override

         public void run() {

                  String message;

 

                  try {    while ((message = reader.readLine()) != null) {

                                   System.out.println("클라이언트메시지:" + message);

 

                                   // 접속한 모든 클라이언트들에게 메시지를 전송한다.

                                   send2AllClient(message);

                           }

 

                  } catch (Exception e) {

                           e.printStackTrace();

                  }

         }

 

         /**

          * 접속한 모든 클라이언트들에게 메시지를 전송한다.

          * @param message */

         public void send2AllClient(String message) {

 

                  // 클라이언트가 서버에 접속할때마다 clientOutputStreams PrintWriter객체들을 저장한다.

                  Iterator<PrintWriter> it = clientOutputStreams.iterator();

 

                  // 접속한 클라이언트 수 만큼 루프처리

                  while (it.hasNext()) {

                           try {  PrintWriter writer = (PrintWriter) it.next();

                                   writer.println(message);

                                   writer.flush();

 

                           } catch (Exception e) {

                                   e.printStackTrace();

                           }

                  }

         }

 

         /**

          * 소켓서버 메인메소드

          * @param args  */

         public static void main(String args[]) {

                  clientOutputStreams = new ArrayList<PrintWriter>();

 

                  try {   ServerSocket serverSocket = new ServerSocket(SOCKET_SERVER_PORT);

                           System.out.println("클라이언트 접속대기...");

                          

                           while (true) {

                                   // 클라이언트 연결요청 Listen 대기

                                   Socket clientSocket = serverSocket.accept();

 

                                   // 클라이언트로 부터 연결요청에의해 생성된 소켓을이용하여

                                   // 출력스트림 생성하여 출력객체를 만든다.

                                   PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());

                                   clientOutputStreams.add(writer);

 

                                                             // 쓰레드 실행: 별도의 프로그램 스택을 구성하여 서버프로그램 실행.

                                   Thread t = new Thread(new SocketServer(clientSocket));

                                   t.start();

 

                                   System.out.println("서버에 클라이언트 연결 생성...");

                           }

                  } catch (Exception ex) {

                           ex.printStackTrace();

                  }

 

         }

 

}

 

 

클라이언트 프로그램 : SocketClient.java

package client;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

 

/**

 * 서버와 통신하기위한 기본 클라이언트 프로그램.

 * @author JSMIN */

public class SocketClient {

         final static String SOCKET_SERVER_IP = "127.0.0.1";

         final static int   SOCKET_SERVER_PORT = 5000;

 

         BufferedReader reader;

         PrintWriter writer;

         Socket socket;

 

         /**

          * 소켓클라이언트 메인 메소드

          * @param args  */

         public static void main(String args[]) {

 

                  SocketClient client = new SocketClient();

 

                  try {   // 서버로의 연결을 구성한 후

                           // 반환된 소켓으로부터 주고 받을 객체(reader/writer)를 얻는다.

                           client.socket = new Socket(SOCKET_SERVER_IP, SOCKET_SERVER_PORT);

                           InputStreamReader streamReader = new InputStreamReader

                                                                   (client.socket.getInputStream());

                          

                           client.reader = new BufferedReader(streamReader);

                           client.writer = new PrintWriter(client.socket.getOutputStream());

 

                           System.out.println("서버로 연결이 형성됨!!");

 

                  } catch (IOException e) {

                           e.printStackTrace();

                  }

 

                  // Runnable 인터페이스를 구현한 클라이언트 프로그램(Job로직이 들어있는)을 실행한다.

                  Thread clientJobs = new Thread(new ClientJobs(client.reader));

                  clientJobs.start();

                 

                  client.sendMessage();

         }

 

         /**

          * 서버에게 메시지를 보내기위하여 위에서

          * 생성한 소켓으로부터 얻은 출력스트림과 연계된 writer를 이용한다*/

         private void sendMessage() {

                  BufferedReader bufferedReader;

                  String message;

 

                  try {    while (true) {

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

                                   message = bufferedReader.readLine();

 

                                   writer.println(message);

                                   writer.flush();

                           }

 

                  } catch (IOException e) {

                           e.printStackTrace();

                  }

 

         }

 

}

 

 

클라이언트 프로그램 : ClientJobs.java

package client;

 

import java.io.BufferedReader;

 

/**

 * 클라이언트에서 일기위한

 * @author JSMIN  */

public class ClientJobs implements Runnable {

 

         BufferedReader reader;

 

         public ClientJobs(BufferedReader reader) {

                  this.reader = reader;

         }

 

         @Override

         public void run() {

                  String message;

                  try {    while ((message = reader.readLine()) != null) {

                                   System.out.println("서버메시지: " + message);

                           }

 

                  } catch (Exception ex) {

                           ex.printStackTrace();

                  }

         }

}

 

 

 

SocketProgram.zip

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

기본 HTTP 웹서버 구현 – TinyHttpd Server  (0) 2013.02.12
서버와의 시간동기화 [ 소켓통신 ]  (0) 2013.02.11
RMI (Remote Method Invovation)  (0) 2013.02.01
Proxy Server 란  (1) 2013.02.01
Posted by Steven J.S Min
,