public class start {
static ServerProvider server;
public static void main(String[] args) {
server=new ServerProvider(255, new CallbackInterface() {
@Override
public void userLogined(EncryptedClient arg0) {
// TODO Auto-generated method stub
System.out.println("사용자 " + arg0.getIPPort() + "가 인증 했습니다.");
broadcast("" + arg0.getIPPort() +" 님이 채팅방에 입장했습니다.");
}
@Override
public void userLoginError(Client arg0) {
// TODO Auto-generated method stub
System.out.println("사용자 " + arg0.getIPPort() + "가 인증 실패 했습니다.");
broadcast("" + arg0.getIPPort() +" 님은 접속 거부 되었습니다.");
}
@Override
public void userDisconnected(Client arg0) {
// TODO Auto-generated method stub
System.out.println("사용자 " + arg0.getIPPort() + "가 퇴장 했습니다.");
broadcast("" + arg0.getIPPort() +" 님이 퇴장했습니다.");
}
@Override
public void userConnected(Client arg0) {
// TODO Auto-generated method stub
System.out.println("사용자 " + arg0.getIPPort() + "가 접속 했습니다.");
broadcast("" + arg0.getIPPort() +" 님이 채팅방에 접속하는 중...");
}
@Override
public void packetQueueReceived(EncryptedClient arg0, ByteWrapper arg1) {
// TODO Auto-generated method stub
System.out.println("<" + arg0.getIPPort() + "> : " + new ByteToRawString(arg1.getBuffer()));
broadcast(("<" + arg0.getIPPort() +"> " +new ByteToRawString( arg1.getBuffer())));
}
});
server.start();
}
static void broadcast(String msg) {
for(int i=0;i<server.getServerMemory().getLoginedClients().size();i++) {
EncryptedClient client = (EncryptedClient) server.getServerMemory().getLoginedClients().get(i);
try {
client.sendEncryptedPacket(msg.getBytes());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
클라이언트측 소스코드
public class start {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.println("접속할 서버 주소를 입력하세요. 비어 있는 경우 127.0.0.1");
String IP = scanner.nextLine();
if(IP.trim().equals("")) {
IP="127.0.0.1";
}
System.out.println("서버 주소 : " + IP);
System.out.print("서버 포트를 입력하세요 : ");
int port = Integer.parseInt(scanner.nextLine());
System.out.println("");
System.out.println("서버의 공개키를 입력하십시오.");
String publicKey= scanner.nextLine();
System.out.println("");
System.out.println(IP + ":" + port + "에 대해 보안 통신을 시작하는 중...");
EncryptedClient client =new EncryptedClient(IP, port,new ClientMemory(),new CallbackConnection() {
@Override
public void packetReceived(ByteWrapper arg0) {
// TODO Auto-generated method stub
System.out.println("[서버] " + new ByteToRawString(arg0.getBuffer()));
}
@Override
public void logined() {
// TODO Auto-generated method stub
}
@Override
public void loginError() {
// TODO Auto-generated method stub
}
@Override
public void disconnected() {
// TODO Auto-generated method stub
}
@Override
public void connected() {
// TODO Auto-generated method stub
}
});
try {
client.getClientMemory().setPublicKey(publicKey);
client.connect();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true) {
String line = scanner.nextLine();
try {
client.sendEncryptedPacket(line.getBytes());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
효과
기본적으로 네트워크 송수신이 필요한 프로젝트에서는 암호화 및 보안이 중요합니다. 기본적인 소켓 통신으로 구현할 때 암호화에 신경을 쓰다 보면 배보다 배꼽이 더 커집니다. 따라서 프로젝트 작업시 소요 시간을 최소화하고 작업 능률을 올리기 위해서 암호화 통신 라이브러리를 개발했습니다. 이 라이브러리를 사용하면 위 소스코드 처럼 간단하게 암호화 통신을 사용할 수 있습니다.물론 해당 라이브러리는 다양한 경로와 방법을 통해 암호화의 안정성을 확인해야 하는 단계에 있습니다.
시연
서버를 먼저 열어봅니다.