260 likes | 657 Views
INDEX. 1. 전체 시스템 구성도 2. 개발환경 3. 사용자 명령어 4. 패킷 구조 및 데이터 구조 5. 알고리즘 및 구현 코드 6. 데이터 흐름도 7. 시험 환경 및 결과 8. 결론 및 개 선 방안. 1. 전체 시스템 구성도 [System Architecure]. 1 . 전체 시스 템 구성도 [ System Architecure]. p2ppeer / p2pserver. sharing. packets. peers. Packet. Peer. FileManager.
E N D
INDEX 1. 전체 시스템 구성도 2. 개발환경 3. 사용자 명령어 4. 패킷 구조 및 데이터 구조 5. 알고리즘 및 구현 코드 6. 데이터 흐름도 7. 시험 환경 및 결과 8. 결론 및 개선 방안
1. 전체 시스템 구성도 [System Architecure] • p2ppeer / p2pserver • sharing • packets • peers Packet Peer FileManager Console PeerManager PacketHandler SharedFile Listener Main RelayManager JAVA Runtime Environment 7u7 Microsoft Windows 7 Ultimate
2. 개발환경 [Development Environment] 그래픽 사용자 인터페이스 윈도우 객체 지향 프로그램 자바
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 프로그램
4. 패킷 및 데이터 구조 [Packet and Data Structures] packet_type data_length 패킷의 종류, 종류에 따라 번호를 매겨 사용 패킷의 데이터의 길이를 표현 1byte 1byte 4byte data packet_option 패킷에 따라 동작을 지정하거나 처리 결과로 사용할 서버에 전달할 메시지의 내용
4. 패킷 및 데이터 구조 [Packet and Data Structures] |패킷 정보 public class Packet { public byte mType; // 패킷 종류 public byte mOption; // 패킷 처리에 사용할 옵션 publicintmPayloadSize; // 패킷 데이터의 길이 public char [] mPayload; // 패킷 데이터 } |파일 정보 public classSharedFile{ publicintmField; // 서버에 등록된 파일 ID publicString mFileName; // 파일 이름 publiclongmFileSize; // 파일 크기 publicString mFileMD5; // 파일의 MD5 체크섬 }
4. 패킷 및 데이터 구조 [Packet and Data Structures] |피어 정보 public classPeer extends Thread { publicintmPeerIndex; // 피어 인덱스 번호 publicSocket mSocket; // 피어 간 통신에 사용되는 소켓 publicStringmPeerAddress; // IP 주소 publicintmPeerPort; // Port 번호 publicString mPeerId; // 서버에 등록한 Username publicbooleanmLeaderPeer= false; // 리더피어 여부 publicbooleanmHolePunched= false; // 홀펀칭 성공 여부 publiclong mLastHeartbeat= 0; // 마지막 Heartbeat 송수신한 시간 publicintmLoads; // 부하 정도 publicbooleanmInitialized= false; // 등록과정 완료 여부 publicbooleanmRunning= false; // 피어 스레드 동작 컨트롤 }
5. 알고리즘 및 구현코드 [Algorithms and Codes] Start Message Digest MD5 메시지 생성 public static String MakeMD5(byte[] stream) { StringBuffermd5 = 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(); } MD5 메시지 문자열로 변환 각 바이트의 상하위 워드 분리 워드를 문자열로 재결합 End
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"; BufferedReaderbr = new BufferedReader(new FileReader(f.getFileName())); char fbuf[] = new char[Packet.MAX_PAYLOAD_SIZE]; inttn = ts.getBytes().length; System.arraycopy(ts.toCharArray(), 0, fbuf, 0, tn); intnread = 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
6. 데이터 흐름도 [Data Flow] START Console.java Main.java Listener.java PacketHandler.java Peer.java Listener 객체 생성 클라이언트 소켓 생성 요청 대기 Packet 헤더의 종류, 옵션 비교 사용자 명령어 처리 Console 객체 생성 Peer 객체 생성 Packet 객체 생성 패킷 처리 후 결과 응답 PacketHandler호출 PeerManager에 추가 사용자 명령어 입력 END Peer
6. 데이터 흐름도 [Data Flow] – Relay 전송 시퀀스 Peer A Server Peer B Peer C 파일 요청 메시지 전송 No 리더피어? 인증코드 요청 Yes 인증코드 전송 인증코드, Peer A 주소 전송 인증코드, 파일 전송 파일 전송
7. 시험 환경 및 결과 [Test Environment and Results] Peer1 Server Peer2 Microsoft Windows XP Professional x86 JAVA Development Kit 7u7 Public IP, 100MB LAN Microsoft Windows 7 Ultimate JAVA Development Kit 7u7 Public IP, 100MB LAN Microsoft Windows XP Professional x86 JAVA Development Kit 7u7 Private IP, 100MB LAN
7. 시험 환경 및 결과 [Test Environment and Results] - Peer 1의 테스트화면 -
7. 시험 환경 및 결과 [Test Environment and Results] - Peer 2의 테스트화면 -
7. 시험 환경 및 결과 [Test Environment and Results] - Server의 테스트화면 - - Server의 로그내용-