Day 27(9/8) TcpipServer

2016. 9. 9. 21:18Programming/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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
 
//**Server 클래스
//HashMap clients: 생성(문자열, out스트림 데이터타입 가능)
//무결성 위해서 싱크로시킴
//*serverStart()메소드
//서버소켓, 소켓을 선언 후에 각각 생성
//accept() 이용해 접속자 있을 때 socket 반환
//socket 안의 InetAddress와 Port 출력
 
public class Server {
    HashMap<String, DataOutputStream> clients;
 
    public Server() {
        clients = new HashMap<String, DataOutputStream>();
        Collections.synchronizedMap(clients);
    }
 
    public void serverStart() {
        ServerSocket server;
        Socket socket;
        try {
            server = new ServerSocket(5000); // 5000은 포트
            socket = new Socket("192.168.0.33"4000);
            socket = server.accept(); // 이 부분 이해가 잘 안 감
            System.out.println(socket.getInetAddress() + ":" + socket.getPort());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    // **serverReceiver(이너 클래스)
    // input, output스트림 각각 만들어 소켓에 연결
    // *sendAll 메소드
    // Iterator로 clients 안 키셋(키 집합) 데이터를 반복해서 저장
    // Iterator 안에 데이터 있는 한, Iterator 안 자료를 output스트림에 저장
    // sendAll(msg)의 msg를 outstream 통해 보냄
    // *run() 메소드 재정의
    // in으로부터 읽어온 것 name으로 저장
    // put()으로 Clients에 name(키), value(out)을 저장
    // size()로 clients 집합 숫자를 반환
    // 남들에게 보여주기 위해 sendAll()로 동일 정보(+name) 보냄
    // in이 있는 한 in 데이터 읽어들임.
 
    class serverReceiver {
        DataInputStream in;
        DataOutputStream out;
 
        public serverReceiver(Socket socket) {
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        public void sendAll(String msg) {
            Iterator it = clients.keySet().iterator();
            while (it.hasNext()) { // Iterator는 hasNext(), next() 세트로 이용
                try {
                    DataOutputStream out = clients.get(it.next()); // 이해가 잘 안 감
                    out.writeUTF(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
        public void run(String name) {
            try {
                name = in.readUTF(); // 들어온 메시지는 name으로 저장
                clients.put(name, out); // name은 out(msg)과 묶여짐
                System.out.println("접속자 수: " + clients.size());
                sendAll(name + "접속자 수: " + clients.size());
                while (in != null) {
                    in.readUTF();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    public static void main(String[] args) {
        new Server().serverStart();
    }
}
cs


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

싱글턴 패턴(Singleton Pattern)  (0) 2016.11.12
HashMap 출력법 3가지  (0) 2016.11.07
Day 26(9/7) TcpipClient  (0) 2016.09.08
Day 25(9/6) 메모장 만들기  (0) 2016.09.06
Day 24(9/5) 채팅창 만들기  (0) 2016.09.05