2016. 09. 08. Thu. 스물세 번째 수업
오늘의 수업내용
네트워크통신(Tcp/Ip Server) 구현하기
- 데이터 구조 hash -> key 입력하면 value가 나오는 구조
- get이 엄청 빠르다. -> MultiThread 구조에서 무결성에 취약함
- 무결성 -> key -> 현실세계의 주민번호와 같은 역할
- TreeMap(stack queue List Tree Set Map Hash)
- synchronizedMap() -> MultiThread 구조에서 무결성을 지켜준다.
예제
package com.javalesson.ch21network;
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;
public class L02TcpIpServer {
HashMap<String,DataOutputStream> clients;
public L02TcpIpServer() {
clients = new HashMap<String,DataOutputStream>();
Collections.synchronizedMap(clients);
}//생성
public void serverStart() {
ServerSocket server = null;
Socket socket = null;
try {
server = new ServerSocket(5000);
System.out.println("서버가 준비되었습니다.");
while(true){//서버가 종료되지 않게 하기위해 thread 하나를 구현
socket = server.accept(); //접속자가 있을 때 Socket을 반환한다.
new ServerReceiver(socket).start();
}
} catch (IOException e){e.printStackTrace();
}
}//serverStart
class ServerReceiver extends Thread {
//client가 보낸 메시지를 받아서 모든 clients에게 다시 메시지를 보낸다.
DataInputStream in;
DataOutputStream out;
public ServerReceiver(Socket socket) {
try {
in = new DataInputStream(socket.getInputStream());
//in을 쓰면 받을 수 있다.
out = new DataOutputStream(socket.getOutputStream());
//out을 쓰면 보낼 수 있다.
} catch(IOException e){e.printStackTrace();
}
}
private void sendAll(String msg) {
Iterator it = clients.keySet().iterator();
while(it.hasNext()) {
try{
DataOutputStream out = clients.get(it.next());
out.writeUTF(msg); //접속시 발생되는 메시지
} catch (IOException e){e.printStackTrace();
}
}
}//sendAll
@Override
public void run() {
String name;
try {
name = in.readUTF();
clients.put(name, out);
out.writeUTF("접속자수: "+clients.size());
sendAll(name+"님 접속 (접속자수: "+clients.size()+")");
while(in!=null){//메시지를 보내는 thread
sendAll(in.readUTF());
}
} catch (IOException e){e.printStackTrace();
}
}//run
}//ServerReceiver
public static void main(String[] args) {
new L02TcpIpServer().serverStart();
}//main
}//class
위의 예제처럼 서버를 구축하고 앞의 포스트 내용의 Tcp/Ip Cilent를 구현해서 IP주소와 포트를 입력하면
접속할 수 있다.
'IT story > Java' 카테고리의 다른 글
ex) 네트워크통신(채팅창 생성) (0) | 2016.09.14 |
---|---|
D+22 네트워크통신 (Tcp/Ip Client) (0) | 2016.09.08 |
D+21 Text Editor(메모장 만들기) (0) | 2016.09.06 |
D+20 awt(text & text editor) (0) | 2016.09.06 |
D+19 Thread(쓰레드) (0) | 2016.09.01 |