낭만 프로그래머

SMB 라이브러리를 이용하여 공유폴더(네트워크 드라이버) 접근하기 본문

Java/Common

SMB 라이브러리를 이용하여 공유폴더(네트워크 드라이버) 접근하기

조영래 2020. 4. 1. 19:19

smbj 관련 jar 파일.zip
3.98MB
jcifs 관련 jar 파일.zip
0.38MB

- Tomcat Server를 윈도우 서비스로 구동시에 네트워크 드라이버(또는 공유폴더) 접근이 되지 않는다. 해결 방법은 SMB 라이브러리를 사용하였다

 

삼바(samba)란?
삼바란 리눅스에서 윈도우쪽 파일시스템과 프린터로 접근 할 수 있게하는 소프트웨어이다.

SMB(Server Message Block)란?
SMB는 윈도우 시스템이 다른 시스템의 디스크나 프린터와 같은 자원을 공유할 수 있도록 하기 위한 것이다.

CIFS(Common Internet File System)란?
CIFS는 인터넷을 위한 SMB 파일 공유 프로토콜의 확장된 버전으로 윈도우와 유닉스 환경을 동시에 지원하는 인터넷의 표준 파일 규약입니다.

 

1. SMB V1 사용 (https://www.jcifs.org/)

- 만일 소스상에 문제가 없는데도 불구하고 계속 Connect Time Out이 발생 시에는 공유폴더 대상의 OS가 SMB V1을 사용하게 체크 되어 있는지 확인하자. (Windows10 경우에는 Default로 체크 되어 있지 않다. https://winaero.com/blog/enable-smb1-sharig-protocol-windows-10/)

//파일 복사 예제

String user = "user";
String pass = "password";
String address = "192.168.1.2";
String sharedFolder="share";
		
String outputPath="smb://"+address+"/"+sharedFolder+"/test.xml";
String inputPath = "C:\\temp\\test.xml";
		
FileInputStream fis = null;
SmbFileOutputStream smbfos = null;

try {
	NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,user, pass);
	File fileSource = new File(inputPath);
	fis = new FileInputStream(fileSource);
	SmbFile outSmbFile = new SmbFile(outputPath,auth);
	smbfos = new SmbFileOutputStream(outSmbFile);

	// 16 kb
	final byte[] b  = new byte[16*1024];
	int read = 0;
	while ((read=fis.read(b, 0, b.length)) > 0) {
		smbfos.write(b, 0, read);
	}
}
catch(Exception e) {
	e.printStackTrace();
}
finally {
	if(fis != null) {
		try {
			fis.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
		if(smbfos != null) {
		try {
			smbfos.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

2. SMB V2 사용 (https://github.com/hierynomus/smbj)

//파일 복사 예제

String user = "user";
String pass = "password";
String address = "192.168.1.2";
String sharedFolder = "share";
String inputPath = "C:\\temp\\test.txt";
		
SMBClient client = new SMBClient();
		
try (Connection connection = client.connect(address)) {
	AuthenticationContext ac = new AuthenticationContext(user, pass.toCharArray(), null);
    Session session = connection.authenticate(ac);

    // Connect to Share
    try (DiskShare share = (DiskShare) session.connectShare(sharedFolder)) {
    	File fileSource = new File(inputPath);
       	com.hierynomus.smbj.utils.SmbFiles.copy(fileSource, share, "test.txt", true);
    }
}
catch(Exception e) {
	e.printStackTrace();
}