Day 27(9/8) TcpipServer
2016. 9. 9. 21:18ㆍProgramming/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 |