BBS > java

Thread Chatting 프로토 타입 2

작성자 : 이창우 (x1wins) | 등록일 : 2011-06-02 | 목록
첨부 파일이 없습니다.
첨부 이미지가 없습니다.
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
 
 
public class EchoThreadServer {
    public static void main(String[] args) {
 
        try{
             
            int port = Integer.parseInt(args[0]);
            ServerSocket serverSocket = new ServerSocket(port);
            HashMap hashMap = new HashMap();
            int id = 0;
             
            while(true){
                Socket socket = serverSocket.accept();
                EchoThread echoTread = new EchoThread(socket, hashMap, id);
                echoTread.start();
                id++;
                 
            }
         
        }catch(Exception e){
            System.out.println(e);
        }
         
    }
 
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

public class EchoThread extends Thread {

	private Socket socket;
	private HashMap hashMap;
	private int id;
	PrintWriter pw;
	BufferedReader br;

	public EchoThread(Socket socket, HashMap hashMap, int id) {

		this.socket = socket;
		this.hashMap = hashMap;
		this.id = id;

	}

	public void run() {

		try {

			InetAddress inetAddress = socket.getInetAddress();
			// System.out.println("=============connecting=============");
			// System.out.println(inetAddress.getHostAddress());
			// System.out.println(inetAddress.getHostName());
			// System.out.println("=============connected==============");

			OutputStream out = socket.getOutputStream();
			InputStream in = socket.getInputStream();

			pw = new PrintWriter(new OutputStreamWriter(out));
			br = new BufferedReader(new InputStreamReader(in));

			synchronized (hashMap) {
				hashMap.put(id, pw);
				String message = id + " come in " + " "
						+ inetAddress.getHostAddress() + " "
						+ inetAddress.getHostName();// 메세지 만들어냄
				sendingMessageToAllUser(message);
			}

			/* 받은 메세지가 있을 경우 사용자들 소켓에게 메세지 보내기 */
			String line = null;
			while ((line = br.readLine()) != null) {

				/* /quit 일경우 접속 해제 */
				if (line.equals("/quit")) {
					String message = id + " was quit";// 메세지 만들어냄
					sendingMessageToAllUser(message);
					break;
				}

				String message = id + " talk : " + line;// 메세지 만들어냄
				sendingMessageToAllUser(message);
			}
			/* 받은 메세지가 있을 경우 사용자들 소켓에게 메세지 보내기 */

			
		} catch (Exception e) {
			System.out.println(e);
		} finally {

			try {

				/* 연결종료 */
				String message = id + " socket close!!! bye~~~";
				sendingMessageToAllUser(message);
				pw.close();
				br.close();
				socket.close();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

	void sendingMessageToAllUser(String message) {

		System.out.println(message);// 모니터링을 위해서 server 콘솔에 찍힘

		synchronized (hashMap) {
			Collection collection = hashMap.values();
			Iterator iter = collection.iterator();
			while (iter.hasNext()) {

				// 사용자 겟수만큼 루프 돔
				// 모든사용자에게 보냄
				PrintWriter pwAll = (PrintWriter) iter.next();
				pwAll.println(message);
				pwAll.flush();

			}
		}
	}

}
package thread.client;
 
import java.net.Socket;
 
public class Client {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         
        try{
            String ip = "61.73.60.51";
//            String ip = "localhost";
            int port = 30000;
            Socket socket =  new Socket(ip,port);
             
            KeyboardThread kt = new KeyboardThread(socket);
            ReceiveThread rt = new ReceiveThread(socket);
             
            kt.start();
            rt.start();
            
            System.out.println("client quit");
             
         
        }catch(Exception e){
            System.out.println(e);
        }
    }
     
}
package thread.client;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
 
public class KeyboardThread extends Thread {
 
    private Socket socket;
     
    public KeyboardThread(Socket socket){
        this.socket = socket;
    }
     
    public void run(){
         
        System.out.println("keyboard run");
         
        try{
             
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
             
            String line = null;
            while((line = keyboard.readLine())!=null){
                
            	
                pw.println(line);
                pw.flush();
                 
            }
             
             
             
        }catch(Exception e){
            System.out.println(e);
        }
         
    }
     
}
package thread.client;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class ReceiveThread extends Thread {
 
    private Socket socket;
     
    public ReceiveThread(Socket socket){
        this.socket = socket;
    }
     
    public void run(){
         
        System.out.println("recevice run");
         
        try{
             
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             
            String line = null;
            while((line=br.readLine())!=null){
                 
                System.out.println(line);
                 
            }
             
        }catch(Exception e){
            System.out.println(e);
        }
         
    }
}
좀 더 정교하게
로그인 하셔야 댓글을 사용하실수 있습니다.
댓글쓰기를 누르면 로그인 페이지로 이동 후 돌아옵니다.
총 댓글 겟수 1
이창우(x1wins) | 2011-06-03
EchoThread 클래스에
62라인 추가
hashMap.remove(id);
번호 제목 등록일 작성자 조회수
671 struts2 intercept (0) 2014-12-29 이창우 1358
670 Reflection (0) 2014-07-07 이창우 1752
665 Timestamp <-> Date (0) 2014-04-02 이창우 1971
664 변환 date ->java.sql.date (0) 2014-03-24 이창우 1859
663 Unparseable date: "" (0) 2014-03-24 이창우 2771
659 Java Primitive Data Types (0) 2014-02-14 이창우 2246
568 abstract interface 차이점 (0) 2012-09-24 이창우 1263
418 Triple DES & DES JAVA ,C (0) 2011-12-26 이창우 2668
403 HttpClient (0) 2011-12-10 이창우 2509
220 콘솔에서 war 만들기 (0) 2011-07-13 이창우 3032
210 servlet 현재 주소 알아오기 (0) 2011-07-09 이창우 2180
188 A Java Runtime (0) 2011-06-27 이창우 2111
173 file 복사 (0) 2011-06-07 이창우 1967
172 파일 받기 (수정) (0) 2011-06-07 이창우 2217
170 파일 받기 (안됨) (0) 2011-06-07 이창우 1747
169 소켓으로 파일 받기(안됨) (0) 2011-06-07 이창우 1964
162 RCP Example (0) 2011-06-03 이창우 1795
161 rcp 설명 사이트 (1) 2011-06-03 이창우 2044
-> Thread Chatting 프로토 타입 2 (1) 2011-06-02 이창우 1659
158 object heap (0) 2011-06-01 이창우 1888
< 1 2 >
글쓰기 검색