package demo.file;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.commons.io.IOUtils;
public class FileServer {
public static void main(String[] args) throws Exception {
// 클라이언트의 연결 요청을 처리할 ServerSocket 생성
ServerSocket server = new ServerSocket(8000);
System.out.println("서버가 시작되었습니다.");
while (true) {
// 클라이언트의 연결요청이 접수되면 그 클라이언트와 통신할 소켓을 제공받는다.
Socket socket = server.accept();
// 소켓으로부터 입력스트림/출력스트림 획득
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 위에서 획득한 스트림을 문자열, 정수, 파일데이터를 송수신할 수 있는
// 보조스트림(DataInpuStream, DataOutputStream)과 연결
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out);
// 클라이언트가 보낸 문자열, 정수 읽어오기
String filename = System.currentTimeMillis() + dis.readUTF();
long filesize = dis.readLong();
// 클라이언트가 보낸 파일을 저장할 스트림 생성하기
FileOutputStream fos = new FileOutputStream("c:/temp/" + filename);
System.out.println("["+filename+"] 저장을 시작");
// 클라이언트가 보낸 파일데이터 읽어서 파일로 저장하기
int readSize = 0; // 읽어온 파일 데이터를 크기를 저장할 변수
int len = 0;
byte[] buf = new byte[1024];
while ((len=dis.read(buf)) != -1) { // 1. 스트림으로부터 데이터 읽기
fos.write(buf, 0, len); // 2. 파일에 기록하기
readSize += len; // 3. 읽어들인 파일 데이터 크기를 증가시키기
if (readSize == filesize) { // 4. 읽어들인 파일의 크기와 파일 사이즈가 일치하면 반복 탈출
break;
}
}
fos.close();
System.out.println("["+filename+"] 저장이 완료");
dos.writeUTF("["+filename+"]의 저장이 완료되었습니다.");
dos.flush();
}
}
}
package demo.file;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import org.apache.commons.io.IOUtils;
public class FileClient {
public static void main(String[] args) throws Exception {
// 소켓을 생성해서 서버에 연결요청하기
Socket socket = new Socket("192.168.10.254", 8000);
// 소켓으로부터 입력스트림/출력스트림 획득하기
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// 소켓으로부터 획득한 스트림을 보조스트림과 연결하기
DataOutputStream dos = new DataOutputStream(out);
DataInputStream dis = new DataInputStream(in);
File file = new File("c:/temp/suyoung.jpg");
String filename = file.getName(); // 파일 이름 획득
long filesize = file.length(); // 파일 사이즈 획득
FileInputStream fis = new FileInputStream(file); // 파일 데이터 획득을 위한 입력 스트림 생성
// 서버로 파일명, 파일사이즈, 파일데이터 보내기
dos.writeUTF(filename);
dos.writeLong(filesize);
IOUtils.copy(fis, dos); // FileInputStream으로 읽어서 DataOutputStream으로 복사
// 서버로부터 메시지 받기
String message = dis.readUTF();
System.out.println("응답 메시지 : " + message);
socket.close();
}
}
'자바(deprecated) > network' 카테고리의 다른 글
sync (0) | 2019.06.10 |
---|---|
store (0) | 2019.06.10 |
simpleClient (0) | 2019.06.10 |
mallClient (0) | 2019.06.10 |
chat (0) | 2019.06.10 |