자바 소켓을 이용하여 텍스트와 이미지를 동시에 전송하는 예
ObjectInputStream, ObjectOutputStream 을 이용하면 텍스트와 Image를 한개의 클래스 인스턴스에 포함시켜서 매우 쉽게 서버로 전송할 수 있다
Client.java
import java.io.*;
import java.net.*;
import javax.swing.ImageIcon;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 1234);
// 연속적으로 2개의 이미지를 서버로 전송한다
ImageIcon img = new ImageIcon("d:/test/sample1.jpg");
DataFormat df = new DataFormat("sample1.jpg", img);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(df);
oos.flush();
// 2번째 이미지 전송
ImageIcon img2 = new ImageIcon("d:/test/sample2.jpg");
DataFormat df2 = new DataFormat("sample2.jpg", img2);
ObjectOutputStream oos2 = new ObjectOutputStream(socket.getOutputStream());
oos2.writeObject(df2);
oos2.flush();
System.out.println("서버로 전송완료");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
class DataFormat implements Serializable {
private String fileName;
private ImageIcon img;
public DataFormat(String fileName, ImageIcon img) {
this.fileName = fileName;
this.img = img;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setImg(ImageIcon img) {
this.img = img;
}
public String getFileName() {
return fileName;
}
public ImageIcon getImg() {
return img;
}
}
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public class Server {
static ServerSocket ss;
public static void main(String[] args) {
try {
ss = new ServerSocket(1234);
while(true) {
System.out.println("서버 대기중...");
Socket socket = ss.accept();
ServerThread svrThread = new ServerThread(socket);
svrThread.start();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class ServerThread extends Thread {
Socket socket;
ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
ObjectInputStream ois = null;
try {
while(true) { // 클라이언트가 연결을 종료할 때까지 데이터를 수신한다
ois = new ObjectInputStream(socket.getInputStream());
DataFormat df = (DataFormat) ois.readObject();
String fileName = df.getFileName();
ImageIcon icon = df.getImg();
Image img = icon.getImage();
BufferedImage bimg = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bimg.createGraphics();
g2.drawImage(img, 0, 0, null);
g2.dispose();
ImageIO.write(bimg, "jpg", new File("d:/test/cpy/"+fileName));
System.out.println("서버에서 수신완료"+fileName);
}
} catch (Exception ex) {
//ex.printStackTrace();
System.out.println("클라이언트 나감");
} finally {
try {
ois.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println("서버에서 수신쓰레드 종료");
}
}