1. 전체 시스템 구성도 2. 개발환경 3. 사용자 명령어 4. 패킷 구조 및...
description
Transcript of 1. 전체 시스템 구성도 2. 개발환경 3. 사용자 명령어 4. 패킷 구조 및...
1. 전체 시스템 구성도
2. 개발환경
3. 사용자 명령어
4. 패킷 구조 및 데이터 구조
5. 알고리즘 및 구현 코드
6. 데이터 흐름도
7. 시험 환경 및 결과
8. 결론 및 개선 방안
INDEX
1. 전체 시스템 구성도 [System Architecure]
JAVA Runtime Environment 7u7
Microsoft Windows 7 Ultimate
p2ppeer / p2pserver
Console
Listener
Main
packets
Packet
Pack-etHandler
RelayMan-ager
peers
Peer
PeerManager
sharing
FileManager
SharedFile
1. 전체 시스템 구성도 [System Architecure]
2. 개발환경 [Develodment Environment]
2. 개발환경 [Development Environment]
그래픽 사용자 인터페이스윈도우
객체 지향 프로그램자바
3. 사용자 명령어 [User Commands]
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]
4. 패킷 및 데이터 구조 [Packet and Data Structures]
패킷에 따라동작을 지정하거나처리 결과로 사용할
패킷의 데이터의길이를 표현
패킷의 종류 ,
종류에 따라번호를 매겨 사용
packet_type
packet_option
data_length
1byte
1byte
4byte
서버에 전달할메시지의 내용
data
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 체크섬
}
| 패킷 정보
| 파일 정보
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; // 피어 스레드 동작 컨트롤
}
| 피어 정보
5. 알고리즘 및 구현코드 [Algorithms and Codes]
5. 알고리즘 및 구현코드 [Algorithms and Codes]
MD5 메시지문자열로 변환
MD5 메시지생성
각 바이트의상하위 워드 분리
워드를문자열로 재결합
Mes-sage
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
5. 알고리즘 및 구현코드 [Algorithms and Codes]
서버에 릴레이준비 알림
Start
End
파일 보유중인피어 접속
인증코드 및 파일 전송
파일 전송 패킷으로 변환
파일 전송
파일 없음알림
요청 받은파일 존재 ?
리더피어 ?홀펀칭 성공 ?
// 서버에 릴레이 준비 알림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);}
// 서버에서 응답받은 인증코드 저장 ( 릴레이 피어 )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);
Y
N N
Y
6. 데이터 흐름도 [Data Flow]
6. 데이터 흐름도 [Data Flow]
Main.java
Listener 객체생성
Console 객체생성
PacketHandler.-java
Packet 헤더의종류 , 옵션 비교
패킷 처리 후결과 응답
Listener.java
클라이언트 소켓생성
Peer 객체생성
PeerManager 에추가
Peer.java
요청 대기
Packet 객체생성
PacketHandler 호출
START
END Peer
Console.-java
사용자 명령어 처리
사용자 명령어 입력
6. 데이터 흐름도 [Data Flow] – Relay 전송 시퀀스
Peer A Server Peer B Peer C
파일 요청
인증코드 요청
인증코드 전송인증코드 , Peer A 주소 전송
인증코드 , 파일 전송
파일 전송
리더피어 ?
Yes
No 메시지 전송
7. 시험 환경 및 결과 [Test Environment and Results]
7. 시험 환경 및 결과 [Test Environment and Results]
Microsoft Windows7 Ultimate
JAVA DevelopmentKit 7u7
Public IP, 100MB LAN
Server Microsoft Windows
XP Professional x86
JAVA DevelopmentKit 7u7
Private IP, 100MB LAN
Peer2Microsoft WindowsXP Professional x86
JAVA DevelopmentKit 7u7
Public IP, 100MB LAN
Peer1
7. 시험 환경 및 결과 [Test Environment and Results]
- Peer 1 의 테스트화면 -
7. 시험 환경 및 결과 [Test Environment and Results]
- Peer 2 의 테스트화면 -
7. 시험 환경 및 결과 [Test Environment and Results]
- Server 의 테스트화면 - - Server 의 로그내용 -
8. 결론 및 개선 방안 [Conclusion]
THANK YOU