Transcript 발표자료
p2ppeer / p2pserver
packets
peers
sharing
Console
Packet
Peer
FileManager
Listener
PacketHandler
PeerManager
SharedFile
Main
RelayManager
JAVA Runtime Environment 7u7
Microsoft Windows 7 Ultimate
그래픽 사용자 인터페이스
윈도우
객체 지향 프로그램
자바
>quit
>show peers
>show files all
>show files <peerID>
프로그램 종료
접속한 peer의 목록 표시
전체 공유파일 목록 표시
해당 peer의 공유파일 목록 표시
자원관리서버
Peer 프로그램
>quit
프로그램 종료
>register <peerID>
peerID로 사용자 등록
>share <fileName>
공유 목록에 해당 파일 추가
>show server
접속한 서버 IP, Port를 표시
>find file <fileName> 파일 검색
>find peer<fileID>
파일 보유중인 peer 검색
>get <filename> <peerID> <peerPort>
상대 peer에게 파일 전송 요청
packet_type
data_length
패킷의 종류,
패킷의 데이터의
종류에 따라
길이를 표현
번호를 매겨 사용
1byte 1byte
4byte
packet_option
패킷에 따라
동작을 지정하거나
처리 결과로 사용할
data
서버에 전달할
메시지의 내용
| 패킷 정보
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 체크섬
}
| 피어 정보
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; // 피어 스레드 동작 컨트롤
}
Start
Message
Digest
MD5 메시지
생성
public static String MakeMD5(byte[] stream) {
StringBuffer md5 = new StringBuffer();
try {
byte[] digest = MessageDigest.getInstance("MD5").digest(stream);
MD5 메시지
문자열로 변환
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));
}
각 바이트의
상하위 워드 분리
워드를
문자열로 재결합
End
}
catch (Exception e) {
}
}
return md5.toString();
Start
요청 받은
파일 존재?
Y
N
리더피어?
홀펀칭 성공?
N
파일 없음
알림
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);
인증코드 및
파일 전송
파일 전송 패
킷으로 변환
파일 전송
// 서버에 릴레이 준비 알림
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);
}
End
// 전달받은 파일 데이터를 파일 전송 패킷으로 변환해 요청 피어에게 재전송
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);
Main.java
Peer.java
START
Listener 객체
생성
Console 객체
생성
요청 대기
Packet 객체
생성
Listener.java
클라이언트 소켓
생성
Peer 객체
생성
Console.java
PeerManager에
추가
사용자 명령어 입력
PacketHandler 호출
PacketHandler.java
Packet 헤더의
종류, 옵션 비교
패킷 처리 후
결과 응답
사용자 명령어 처리
END
Peer
Peer A
Server
Peer B
파일 요청
메시지 전송
No
리더피어?
Yes 인증코드
인증코드 전송
요청
인증코드, Peer A 주소 전송
인증코드, 파일 전송
파일 전송
Peer C
Peer1
Server
Peer2
Microsoft Windows
XP Professional x86
Microsoft Windows
7 Ultimate
Microsoft Windows
XP Professional x86
JAVA Development
Kit 7u7
JAVA Development
Kit 7u7
JAVA Development
Kit 7u7
Public IP, 100MB LAN
Public IP, 100MB LAN
Private IP, 100MB LAN
- Peer 1의 테스트화면 -
- Peer 2의 테스트화면 -
- Server의 테스트화면 -
- Server의 로그내용 -