Download presentation
Presentation is loading. Please wait.
Published byJosefina Mendoza Córdoba Modified 6년 전
1
INDEX 1. 전체 시스템 구성도 2. 개발환경 3. 사용자 명령어 4. 패킷 구조 및 데이터 구조
5. 알고리즘 및 구현 코드 6. 데이터 흐름도 7. 시험 환경 및 결과 8. 결론 및 개선 방안
2
1. 전체 시스템 구성도 [System Architecure]
3
1. 전체 시스템 구성도 [System Architecure]
JAVA Runtime Environment 7u7 Microsoft Windows 7 Ultimate p2ppeer / p2pserver Console Listener Main packets Packet PacketHandler RelayManager peers Peer PeerManager sharing FileManager SharedFile
4
2. 개발환경 [Develodment Environment]
5
2. 개발환경 [Development Environment]
그래픽 사용자 인터페이스 윈도우 객체 지향 프로그램 자바
6
3. 사용자 명령어 [User Commands]
7
3. 사용자 명령어 [User Commands]
>quit 프로그램 종료 >show peers 접속한 peer의 목록 표시 >show files all 전체 공유파일 목록 표시 >show files <peerID> 해당 peer의 공유파일 목록 표시 자원관리서버 >quit 프로그램 종료 >register <peerID> peerID로 사용자 등록 >share <fileName> 공유 목록에 해당 파일 추가 >show server 접속한 서버 IP, Port를 표시 >find file <fileName> 파일 검색 >find peer<fileID> 파일 보유중인 peer 검색 >get <filename> <peerID> <peerPort> 상대 peer에게 파일 전송 요청 Peer 프로그램
8
4. 패킷 및 데이터 구조 [Packet and Data Structures]
9
4. 패킷 및 데이터 구조 [Packet and Data Structures]
packet_type data_length 패킷의 종류, 종류에 따라 번호를 매겨 사용 패킷의 데이터의 길이를 표현 1byte 4byte packet_option data 패킷에 따라 동작을 지정하거나 처리 결과로 사용할 서버에 전달할 메시지의 내용
10
4. 패킷 및 데이터 구조 [Packet and Data Structures]
| 패킷 정보 public class Packet { public byte mType; // 패킷 종류 public byte mOption; // 패킷 처리에 사용할 옵션 public int mPayloadSize; // 패킷 데이터의 길이 public char [] mPayload; // 패킷 데이터 } | 파일 정보 public class SharedFile { public int mField; // 서버에 등록된 파일 ID public String mFileName; // 파일 이름 public long mFileSize; // 파일 크기 public String mFileMD5; // 파일의 MD5 체크섬 }
11
4. 패킷 및 데이터 구조 [Packet and Data Structures]
| 피어 정보 public class Peer extends Thread { public int mPeerIndex; // 피어 인덱스 번호 public Socket mSocket; // 피어 간 통신에 사용되는 소켓 public String mPeerAddress; // IP 주소 public int mPeerPort; // Port 번호 public String mPeerId; // 서버에 등록한 Username public boolean mLeaderPeer = false; // 리더피어 여부 public boolean mHolePunched = false; // 홀펀칭 성공 여부 public long mLastHeartbeat = 0; // 마지막 Heartbeat 송수신한 시간 public int mLoads; // 부하 정도 public boolean mInitialized = false; // 등록과정 완료 여부 public boolean mRunning = false; // 피어 스레드 동작 컨트롤 }
12
5. 알고리즘 및 구현코드 [Algorithms and Codes]
13
5. 알고리즘 및 구현코드 [Algorithms and Codes]
MD5 메시지 문자열로 변환 생성 각 바이트의 상하위 워드 분리 워드를 문자열로 재결합 Message Digest Start public static String MakeMD5(byte[] stream) { StringBuffer md5 = new StringBuffer(); try { byte[] digest = MessageDigest.getInstance("MD5").digest(stream); for (int i = 0; i < digest.length; i++) { md5.append(Integer.toString((digest[i] & 0xf0) >> 4, 16)); md5.append(Integer.toString(digest[i] & 0x0f, 16)); } catch (Exception e) { return md5.toString(); End
14
5. 알고리즘 및 구현코드 [Algorithms and Codes]
// 서버에 릴레이 준비 알림 if (PeerManager.get(0).isLeaderPeer() || PeerManager.get(0).isHolePunched()) { String auth = RelayManager.addRelay(peer, packet.getPayload()); packet.setType(TYPE_RELAY_PEERS); packet.setOption((byte) 0); packet.setPayload(auth + "\t" + packet.getPayload()); PeerManager.get(0).write(packet); } else { packet.setType(TYPE_GENERAL_MESSAGE); packet.setOption(GMSG_FILE_NOT_FOUND); packet.setPayload(""); peer.write(packet); peer.setRunning(false); } Start 파일 없음 알림 요청 받은 파일 존재? N 리더피어? 홀펀칭 성공? N Y Y 서버에 릴레이 준비 알림 // 서버에서 응답받은 인증코드 저장 (릴레이 피어) msg = packet.getPayload().split("\t"); RelayManager.replaceAuth(msg[0], msg[1]); 파일 보유중인 피어 접속 // 서버에서 전달받은 릴레이 피어의 주소로 접속, 인증코드와 파일 전송 msg = packet.getPayload().split("\t"); c.connect(new InetSocketAddress(msg[2], Integer.parseInt(msg[3]))); Peer p = new Peer(PeerManager.popIndex(), c); String ts = msg[0] + "\t" + msg[1] + "\t" + f.getFileName() + "\t"; BufferedReader br = new BufferedReader(new FileReader(f.getFileName())); char fbuf[] = new char[Packet.MAX_PAYLOAD_SIZE]; int tn = ts.getBytes().length; System.arraycopy(ts.toCharArray(), 0, fbuf, 0, tn); int nread = br.read(fbuf, tn, Packet.MAX_PAYLOAD_SIZE - tn); packet.setPayload(fbuf, tn + nread); p.write(packet); 인증코드 및 파일 전송 파일 전송 패킷으로 변환 // 전달받은 파일 데이터를 파일 전송 패킷으로 변환해 요청 피어에게 재전송 msg = packet.getPayload().split("\t"); packet.setType(TYPE_TRANSFER_FILE); packet.setOption((byte) 0); packet.setPayload(msg[1] + "\t" + msg[2] + "\t" + msg[3]); p.write(packet); 파일 전송 End
15
6. 데이터 흐름도 [Data Flow]
16
6. 데이터 흐름도 [Data Flow] Main.java Listener.java Peer.java Console.java
생성 Console 객체 PacketHandler.java Packet 헤더의 종류, 옵션 비교 패킷 처리 후 결과 응답 Listener.java 클라이언트 소켓 Peer 객체 PeerManager에 추가 Peer.java 요청 대기 Packet 객체 PacketHandler 호출 START END Peer Console.java 사용자 명령어 처리 사용자 명령어 입력
17
6. 데이터 흐름도 [Data Flow] – Relay 전송 시퀀스
Peer A Server Peer B Peer C 파일 요청 인증코드 요청 인증코드 전송 인증코드, Peer A 주소 전송 인증코드, 파일 전송 파일 전송 리더피어? Yes No 메시지 전송
18
7. 시험 환경 및 결과 [Test Environment and Results]
19
7. 시험 환경 및 결과 [Test Environment and Results]
Microsoft Windows XP Professional x86 JAVA Development Kit 7u7 Public IP, 100MB LAN Peer1 Microsoft Windows 7 Ultimate JAVA Development Kit 7u7 Public IP, 100MB LAN Server Microsoft Windows XP Professional x86 JAVA Development Kit 7u7 Private IP, 100MB LAN Peer2
20
7. 시험 환경 및 결과 [Test Environment and Results]
- Peer 1의 테스트화면 -
21
7. 시험 환경 및 결과 [Test Environment and Results]
- Peer 2의 테스트화면 -
22
7. 시험 환경 및 결과 [Test Environment and Results]
- Server의 테스트화면 - - Server의 로그내용 -
23
8. 결론 및 개선 방안 [Conclusion]
Similar presentations