File Request & Response in Java Socket
클라이언트 소켓으로부터 파일명을 수신한 서버가 해당 파일을 클라이언트에게 전송하는 예
JFrame의 JLabel 에 출력된 이미지를 파일에 저장하는 예제도 포함되어 있음(페이지 하단 참조)
Server.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.kdea.filetransfer;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author duniv6-000
*/
public class Server
{
public static void main(String[] args)
{
init();
}
private static void init()
{
ServerSocket ss = null;
try {
ss = new ServerSocket(1234);
} catch (IOException ex) {
ex.printStackTrace();
//Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
while(true)
{
System.out.println("서버 대기중....");
try {
Socket socket = ss.accept();
System.out.println("클라이언트 접속");
// 텍스트 데이터를 수신하여 파일명을 확인한다
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
String fn = null;
if(line.indexOf("IMG_REQ:")!=-1)
{
fn = line.split(":")[1];
}
// 클라이언트가 요청한 파일을 전송해준다
new ImgTransThread(socket, fn).start();
}catch(Exception ex) {
System.out.println("클라이언트 퇴장");
//ex.printStackTrace();
}
}
}
}
ImgTransThread.java
class ImgTransThread extends Thread
{
Socket socket;
String fileName;
ImgTransThread(Socket socket, String fileName)
{
this.socket = socket;
this.fileName = fileName;
}
@Override
public void run()
{
// 클라이언트가 요청한 파일을 전송해준다
try {
OutputStream os = socket.getOutputStream();
FileInputStream fin = new FileInputStream("d:/test/"+fileName+".jpg");
byte[] buf = new byte[1024];
int read = 0;
while((read=fin.read(buf, 0, buf.length))!=-1)
{
os.write(buf, 0, read);
}
fin.close();
os.close(); // 스트림을 닫아야만 클라이언트 측에서 파일 수신을 종료할 수 있다
System.out.println("파일 전송완료");
}catch(IOException ex) {
System.out.println("클라이언트 퇴장");
//ex.printStackTrace();
}
}
}
Client.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.kdea.filetransfer;
import java.awt.image.BufferedImage;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
*
* @author duniv6-000
*/
public class Client
{
public static void init()
{
Socket socket = null;
try {
socket = new Socket("localhost", 1234);
InputStream is = socket.getInputStream();
BufferedImage bi = ImageIO.read(is);
ImageIcon icon = new ImageIcon(bi);
ClientFrame.mFrame.displayImage(icon);
System.out.println("수신된 이미지를 화면에 출력함");
} catch (Exception ex) {
ex.printStackTrace();
//Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
// JFrame 클래스에서 이 메소드를 호출할 때 파일명을 전달한다
static void getImage(String name)
{
Socket socket = null;
try {
socket = new Socket("localhost", 1234);
// 이미지 파일명을 서버로 전달
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
pw.println("IMG_REQ:"+name);
pw.flush();
new ImgReceiverThread(socket).start(); // 이미지 데이터를 수신하는 쓰레드 실행
} catch (Exception ex) {
ex.printStackTrace();
//Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
ImgReceiverThread.java
class ImgReceiverThread extends Thread
{
Socket socket;
ImgReceiverThread(Socket socket)
{
this.socket = socket;
}
@Override
public void run()
{
try {
// 서버로부터 이미지 수신 및 화면에 이미지 출력
InputStream is = socket.getInputStream();
BufferedImage bi = ImageIO.read(is);
ImageIcon icon = new ImageIcon(bi);
// JFrame 클래스의 콜백 메소드를 호출하여 JFrame 화면에 이미지를 출력한다
ClientFrame.mFrame.displayImage(icon);
System.out.println("수신된 이미지를 화면에 출력함");
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
//Logger.getLogger(ImgReceiverThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
JFrame 화면의 JLabel 에 출력된 이미지를 파일에 저장하는 예
// JLabel에 출력된 이미지를 파일에 저장
private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {
ImageIcon icon = (ImageIcon)labelImg.getIcon();
BufferedImage bi = (BufferedImage)icon.getImage();
File outputfile = new File("d:/test/saved.png");
try {
ImageIO.write(bi, "png", outputfile);
System.out.println("파일저장 성공");
}catch(Exception ex) {
ex.printStackTrace();
}
}