Java/CodingPractice

[Java/CodingPractice]03. CodingPractice03

양승길 2016. 7. 30. 22:02

[Java/CodingPractice]03. CodingPractice03


그룹 채팅.


Host.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.chat.server;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import com.chat.util.BroadCast;
import com.chat.util.GuestVO;
 
public class Host extends Thread {
    
    private ServerSocket serverSocket;
    private Socket       socket;
    private List<GuestVO>  guests;
    private int          port;
    
    public Host(int port) throws IOException  {
        super();
        this.port = port;
        this.serverSocket = new ServerSocket(this.port);
        guests = new ArrayList<GuestVO>();
        Collections.synchronizedList(guests);
    }
    
    @Override
    public void run(){
        System.out.println("채팅방을 켰음. 게스트들을 대기중... ");
        try {
            while(true){
                BroadCast broadCast = new BroadCast(serverSocket.accept(), this.guests);
                broadCast.start();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
 
    public static void main(String args[]) throws IOException{
        new Host(8080).start();
    }
    
    
 
}
 
cs


BroadCast.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.chat.util;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;
 
public class BroadCast extends Thread {
    
    private BufferedReader bufferedReader;
    private PrintWriter printWriter;
    private String chatFromReceiver;
    private List<GuestVO> guests;
    
    /// Constructor
    public BroadCast(Socket socket, List<GuestVO> guests) throws IOException{
        super();
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        printWriter = new PrintWriter(socket.getOutputStream());
        this.guests = guests;
    }
    
    public void closeAll() throws IOException{
        bufferedReader.close();
        printWriter.close();
    }
    
    public void sendToAll(String message){
        for(GuestVO guest: guests){
            guest.getPrintWriter().println(message);
            guest.getPrintWriter().flush();
        }
    }
    
    @Override
    public void run() {
        GuestVO guest = null;
        // TODO Auto-generated method stub
        try {
            
            guest = new GuestVO(printWriter, bufferedReader.readLine());
            System.out.println("\"" + guest.getName() + "\"님이 접속함.");
            guests.add(guest);
            sendToAll("\"" + guest.getName() + "\" 님이 접속함.");
            
            while ((chatFromReceiver = bufferedReader.readLine()) != null){
                System.out.println("[ "+ guest.getName() +" ] : "+ chatFromReceiver);
                sendToAll("[ "+ guest.getName() +" ] : "+ chatFromReceiver);
            }
            closeAll();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            System.out.println("\"" + guest.getName() + "\"님이 나감.");
            sendToAll("\"" + guest.getName() + "\"님이 나감.");
            guests.remove(guest);
        }
    }
}
 
cs


GuestVO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.chat.util;
 
import java.io.PrintWriter;
 
public class GuestVO {
    
    private PrintWriter printWriter;
    private String name;
    
    public GuestVO(PrintWriter printWriter, String name) {
        super();
        this.printWriter = printWriter;
        this.name = name;
    }
 
    public PrintWriter getPrintWriter() {
        return printWriter;
    }
 
    public void setPrintWriter(PrintWriter printWriter) {
        this.printWriter = printWriter;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
    
}
 
cs


Guest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.chat.client;
 
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
 
import com.chat.util.Receiver;
import com.chat.util.Sender;
 
public class Guest extends Thread {
    
    private Socket socket;
    private Sender sender;
    private Receiver receiver;
    private Scanner scanner;
 
    /// Constructor
    public Guest(String iPv4, int port) throws IOException {
        this.socket = new Socket(iPv4, port);
        this.scanner = new Scanner(System.in);
        this.sender = new Sender(socket, scanner);
        this.receiver = new Receiver(socket);
    }
 
    @Override
    public void run() {
        sender.start();
        receiver.start();
    }
    
    public static void main(String[] args) throws IOException{
        Guest guest = new Guest("localhost"8080);
        guest.start();
    }
    
}
 
cs


Receiver.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.chat.util;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class Receiver extends Thread {
    private BufferedReader bufferedReader;
    private String chatFromReceiver;
 
    /// Constructor
    public Receiver(Socket socket) throws IOException{
        super();
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    
    public void closeAll() throws IOException{
        bufferedReader.close();
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            while ((chatFromReceiver = bufferedReader.readLine()) != null){
                System.out.println(chatFromReceiver);
            }
            closeAll();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
 
cs


Sender.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.chat.util;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
 
public class Sender extends Thread{
    private PrintWriter printWriter;
    private Scanner scanner;
    private String chatToReceiver;
 
    /// Constructor
    public Sender(Socket socket, Scanner scanner) throws IOException{
        super();
        this.printWriter = new PrintWriter(socket.getOutputStream());
        this.scanner = scanner;
    }
    
    public void closeAll() throws IOException{
        printWriter.close();
        scanner.close();
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        
        System.out.println("서버에 접속함. 이름 입력.");
        printWriter.println(scanner.nextLine());
        printWriter.flush();
        
        try {
            while ((chatToReceiver = scanner.nextLine()) != null) {
                
                if (chatToReceiver.equals("exit")) {
                    break;
                }
                printWriter.println(chatToReceiver);
                printWriter.flush();
            }
            closeAll();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
 
cs