Итак, вот классик с комментами. Писать статью мне ессно лень и отсутствует время. Шо это делает? Отправляет сриншот объекта определенного на сервер. Исходник сервера тут же. То есть можно сделать фотошоп online  | Код | package ru.z3studio.batsuev.net { import flash.utils.ByteArray; import flash.net.Socket; import flash.events.IEventDispatcher; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.events.ProgressEvent; import flash.display.IBitmapDrawable; import flash.display.BitmapData; import flash.geom.Rectangle;
/** * Класс для отправки изображений на сервер * @author Alex S Batsuev aka AlDev * http://batsuev.z3studio.ru * mail:[email protected] * @date 12 сентября 2006 */ public class BitmapSaver { private var socket:Socket; private var data:ByteArray; private var rect:Rectangle; /** * Конструктор класса, создает сокет для связи с сервером и получает данные о битмапе * @param bitmapDrawable:IBitmapDrawable объект, с которого будем делать снимок * @param rect:Rectangle границы снимка * @return Объект класса BitmapSaver **/ public function BitmapSaver(bitmapDrawable:IBitmapDrawable,rect:Rectangle) { //создадим объект класса BitmapData var bitmapData:BitmapData = new BitmapData(rect.width,rect.height); //занесем в него данные изображения bitmapData.draw(bitmapDrawable); //получим ByteArray пикселей //хранятся в нем значения цветов слева направо сверху вних картинки //каждое значение по 4 байта - ARGB //причем uint this.data = bitmapData.getPixels(rect); //создадим сокет this.socket = new Socket(); //и сконфигурируем его листенеры this.configListeners(this.socket); //запомним размеры this.rect = rect; } /** * метод send. Коннектится к серверу и начинает слать ему данные * @param host:String адрес сервера * @param port:uint порт, который слушается сервером **/ public function send(host:String, port:uint):void { this.socket.connect(host,port); } /** * метод configListeners. Конфигурирет листенеры для сокета * @param dispatcher:IEventDispatcher наш сокет */ private function configListeners(dispatcher:IEventDispatcher):void { //событие на подключение dispatcher.addEventListener(Event.CONNECT, this.connectHandler); //событие на получение данных от сервера dispatcher.addEventListener(ProgressEvent.SOCKET_DATA, this.progressHandler); } /** * хэндлер на событие подключения к серверу **/ private function connectHandler(event:Event):void { //отправим ширину this.socket.writeInt(this.rect.width); //отправим высоту this.socket.writeInt(this.rect.height); //отправим данные битмапа this.socket.writeBytes(this.data,0,this.data.bytesAvailable); } /** * хэндлер на получение данных от сервера **/ private function progressHandler(progressEvent:ProgressEvent):void { this.socket.close(); } } }
|
Ну и серверная часть: | Код | package src;
import java.net.ServerSocket; import java.net.Socket; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.imageio.ImageIO;
/** * Класс для создания серверного сокета и приема подключений * @author Alex S Batsuev */ public class ImageSaver { private ServerSocket serverSocket; public ImageSaver() { try { //создадим серверный сокет на 1020 порту this.serverSocket = new ServerSocket(1020); this.init(); }catch (IOException ex) { //если создать не получилось, убиваем себя аб стенку ex.printStackTrace(System.err); System.exit(-1); } } private void init() { //обрабатываем подключения к серверу while (true) { try { //когда происходит подключение создаем новый Socket Socket s = this.serverSocket.accept(); //создадим обработчик соединения ConnectionParser parser = new ConnectionParser(s); //создадим новый тред для возможности одновременной работы с несколькими пользователями Thread t = new Thread(parser); //пустим потом t.start(); }catch (IOException ex) { //в случае ошибки выдадим сообщение System.err.println("accept failed"); } } } public static void main(String[] args) { //создадим сервак AdvertisementServer advertisementServer = new AdvertisementServer(); } }
/** * Класс для обработки данных от клиента * @author Alex S Batsuev */ class ConnectionParser implements Runnable { //сокет private Socket socket; //поток входящих данных с сервера private InputStream inputStream; /** * конструктор класса * @param s Socket подключившийся к серверу сокет */ public ConnectionParser(Socket s) { //установим ссылку на сокет this.socket = s; } /** * определим метод, срабатывающий при пуске треда */ public void run() { try { //получим поток данных this.inputStream = this.socket.getInputStream(); //считаем из него ширину (4 байта) int width = this.inputStream.read()*0x1000000; width += this.inputStream.read()*0x10000; width += this.inputStream.read()*0x100; width += this.inputStream.read(); //далее считаем высоту (4 байта) int height = this.inputStream.read()*0x1000000; height += this.inputStream.read()*0x10000; height += this.inputStream.read()*0x100; height += this.inputStream.read(); //создадим массив для байтов изображения (на сколько вы помните там все по 4 байта //ибо ARGB byte[] bytes = new byte[width*height*4]; //количество считаных байт int readed = 0; //читаем из потока все что можно до того, сколько нужно while (readed<(width*height*4)) { int nowRead = this.inputStream.read(bytes,readed,this.inputStream.available()); readed += nowRead; } //создаем файл изображения из этих данных this.createImageFile(width,height,bytes); } catch (IOException e) { e.printStackTrace(System.err); this.socket = null; } } private void createImageFile(int width, int height,byte[] bytes) { //сформируем массив RGB int[] argb = new int[bytes.length/4]; int index = 0; int r,g,b; for (int i=0;i<bytes.length;i++) { //преобразуем unsigned в signed r = 0xFF & bytes[i+1]; g = 0xFF & bytes[i+2]; b = 0xFF & bytes[i+3]; //запишем значение RGB argb[index] = r*0x10000+g*0x100+b; i+=3; index++; } //Создадим bufferedImage типа RGB (без альфа-канала) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); index = 0; int colIndex = 0; int rowIndex = 0; //нарисуем его ручками while (index<argb.length) { image.setRGB(colIndex, rowIndex, argb[index]); colIndex++; if (colIndex>=width) { rowIndex++; colIndex = 0; } index++; } try { //и сохраним как jpg ImageIO.write(image,"jpg", new File("C:\\test.jpg")); }catch (IOException e) { e.printStackTrace(System.err); } //отправим клиенту 1 в знак того, что все сделано this.sendSuccefulyPacket(); } private void sendSuccefulyPacket() { try { //получим outputStream с сокета OutputStream outputStream = this.socket.getOutputStream(); //запишем туда 1 outputStream.write(1); //и закроем поток outputStream.close(); } catch (IOException e) { e.printStackTrace(System.err); this.socket = null; } } }
|
Добавлено @ 17:54 ЗЫ: http://batsuev.z3studio.ru/?p=18ток не знаю что назвать оригиналом =)
|