Java Project 
ChatServer.class
package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
  
public class ChatServer {

	int PORT = 5000;
	ArrayList<ClientThread> clientList = new ArrayList<ClientThread>();
	String who;

	public ChatServer() { // default Constructor
		System.out.println("시작");
		try {
			// 1. 서버소켓을 생성한다. port
			ServerSocket server = new ServerSocket(PORT);
			System.out.println("서버생성 및 레디상태");

			while (true) {
				// 2. 서버소켓이 클라이언트가 접속할수 있도록 ready
				Socket socket = server.accept(); // accept에 block
				String who=socket.getInetAddress().getHostAddress();
				System.out.println("접속 IP :"+ who);
				ClientThread thread=new ClientThread(socket);

				thread.start();

			}
		} catch (IOException e) {
		}
	}

	// 클라이언트와 데이터를 주고 받는 기능을 담당
	class ClientThread extends Thread{
		Socket socket;
		BufferedReader br;  // 데이터 받을 때 사용
		PrintWriter pw;       //  데이터 보낼 때 사용

		public ClientThread (Socket socket){
			this.socket=socket;
			try {
				InputStream is=socket.getInputStream();
				InputStreamReader isr=
						new InputStreamReader(is);				
				br = new BufferedReader(isr);
				pw = new PrintWriter(socket.getOutputStream());

				// Line 단위로 보냈으니 Line단위로 읽자
				String firstMessage = br.readLine();
				who=socket.getInetAddress().getHostAddress();
				sendAll(who+" connected");

				//나는 내가 접속했습니다라는 메세지를 받지 않음
				clientList.add(this);  

				System.out.println(firstMessage);

			} catch (Exception e) {
			}
		}

		@Override
		public void run() {			
			super.run();
			try{
				String line="";
				while(  ( line=br.readLine()) !=null ) {
					System.out.println(line);
					if(line.equals("/exit")){
						clientList.remove(this);
						sendAll(who+" leaved ");
					}
					sendAll(line);
				}
			}catch(Exception e){				
			}
		}

		// 데이터 보내는 메서드
		public void send(String line){
			pw.println(line);
			pw.flush();
		}

		@Override
		public void destroy() {
			pw.println("/exit");
			pw.flush();
			pw.close();
			try{
				socket.close();
			}catch (Exception e) {
			}
		}
	}

	// 서버에 연결된 모든 클라이언트에게 메세지를 보내기
	public void sendAll(String line){

		// ArrayList안에 들은 모든 쓰레드에게
		for(ClientThread oneThread : clientList ){
			oneThread.send(line);
		}
	}

	public static void main(String[] args) {
		new ChatServer();
	}
}



'Android > 2012.04월 강좌' 카테고리의 다른 글

Toast 에 이미지 띄우기  (0) 2012.05.17
13일차 Font  (0) 2012.05.14
11일차 SocketServer (Client,Server C->S, S->C)  (0) 2012.05.10
11일차 Json  (0) 2012.05.10
11일차 NavarOpenAPI 이용한 Dom Parser  (0) 2012.05.10

+ Recent posts