Figy! Irtam en mar progressbaros feltoltot AS3-ban. Php volt szerveroldalon (semmi extra modul nem volt hozza, mert a M.....center webhostingjan volt). Egyszerre barmennyi file-t foltol, letolt (ha megszakad a letoltes, folytathato, ahol abbamaradt). De mindez meg semmi. Kozben kecskepornot neztem a bal szememmel. Nna?
Egyebkent kosz, hogy beleugatsz, mert pont ezert tettem fol a temat a forumra, hogy "beleugassanak" masok.
Az elozoeket osszevetve: Egy DataHandler (@XmlMimeType("application/octet-stream")-el annotalva ) tipust kuld web service-on keresztul a server. Megneztem a DataHandler forrasat, probaltam leszarmaztatni sajat class-t, es azt kuldeni a kliensnek. (DataHandlernek raadasul nincs ures konstruktora sem) elvereztem a mime tipusokon. (Nem tudom most megmutatni az exceptiont, mert nincs nalam a kod)
Mindezeket azert irom, mert nem az a helyzet - amit folyamatosan bizonygatni kell itt a forumon ahelyett, hogy a web service-rol lehetne beszelni - hogy arra nem veszem a faradsagot, hogy odabokjek a guglinak. Semmilyen talalat nincs web service-os file atvitelre, ahol lenne valamifele progressbar. Nekem viszont, mint nem tulzottan hozzaertonek, azok a talalatok, mint amilyet te is kuldtel nem nagyon segitenek (nem tudom hogyan kossem hozza az en DataHanler tipusomhoz). Nem akarok en itt kesz kodot latni. Valami olyan tipus kellene, amiben at tudom kuldeni a binarist MTOM-mal, es hozzaferest ad a file-atvitel soran, a tobbit mar megoldom en.
reszlet a datahandler egyik publicvoid writeTo(OutputStream os) throwsIOException metodusabol:
"Oke. alapbol tenyleg igy van, de van php alatt megoldas, last amit irtam..."
Hogy kulon modullal meg lehet oldani, mar huszonotszor megirtuk mindketten, te is en is. Te leirod huszonhatodszor is. Nna most, en vettem a faradsagot, es megneztem a korabbi hozzaszolasaiadat, es nem ugy tunik, mintha nem tudnal haromig szamolni. Ergo itt valami ugratasrol van szo. En voltam lassu, mostmar vettem a lapot. :))))))))))))
php-nal: ha legalabb elolvastad volna amit irtam, nem irnal ilyen butasagokat. Oke. alapbol tenyleg igy van, de van php alatt megoldas, last amit irtam...
php-nel mi volt a problema? Az, hogy mikor hozzanyulhatnal a file-hoz a a serveren a kododdal, mar regen font van a teljes allomany a serveren. Progressbar kilove.
mi a problemam kliens oldalon (letoltesnel)? Hogy a web service hivasat megvalosito utasitast kovetoen, mar cs.szhetem az egeszet, mert lent van a memoriaban az egesz file.
DataHandler dh = fws.fileDownload("a.jpg");
(olyan butasagok jutottak az eszembe, hogy szalak, meghogy ha file-ba menne a dolog, akkor lehetne azzal jatszani) De gyanitom, hogy van ennel joval egyszerubb megoldas is.
magamat idezem: "(vannak ezt kikerulni kepes modulok "vagymik" php-hez, de errol szerintem egy webhostingos szolgaltatonal ne is almodjunk)"
teged: "Egyrészt, ha legalább egy micronnyi időt rászántál volna, és legalább rákeresnél, hogy ne érezd teljesen tudatlanul, akkor kapásból látod, hogy van megoldás php alatt is."
Ezt a kettot hogy hozod ossze?
Egyebkent ez az egyszeru megoldas szerinted, hogy kikunyizom a szolgaltatonal, hogy telepitse mar fol azt a modult? Most is mondom: alapbol nem tudsz progressbaros php-js kodot irni. Persze kulon modul telepitesevel igen. De ezt irtam mar korabban is. Ezert a fenti megjegyzesed azt mutatja nem olvastad el, amit irtam. Na ez kilove.
Igy nez ki a letoltos szerveroldali kod: ( a class annotalva @MTOM annotacioval)
@Override public @XmlMimeType("application/octet-stream") DataHandler fileDownload(String name) { File file = new File("/home/xxxxx/" + name); FileDataSource fd = new FileDataSource(file); DataHandler dh = new DataHandler(fd); return dh; }
Odaig jutottam hogy ehhez nem erdemes hozzanyulni. Visziont kliens oldalon van egy StreamingDataHandler-es lehetoseg.
Nem talaltam sehol a neten olyan cuccot ezen kivul, amibol kiindulhatnek. Egyaltalan nem tunik trivialisnak a dolog, fokeppen, hogy nem profi java-s vagyok.
Elhiszem hogy en vagyok a setét, ezzel gond nincs. De.
Egyrészt, ha legalább egy micronnyi időt rászántál volna, és legalább rákeresnél, hogy ne érezd teljesen tudatlanul, akkor kapásból látod, hogy van megoldás php alatt is. Ajánlom a google: php file upload with progressbar. Rohadt bonyolult keresési szöveg elismerem. Szóval apc támogatással van. Ergó ez kilőve.
A másik, leírtad a java kódot, amibe tulajdonképpen a megoldás is benne van, csak vélhetően úgy keresed a megoldást itt is mint a fenti esetben.
Igen, lehetséges mindkét általad leírt esetekben. A java-java példához, hogy javaslatott lehessen tenni, tudni kellene mi is van abban a fws.fileUpload hivásban. Esetleg ha belenéznél Te is biztos meglátnád, hol lehet megfogni, azt amikor az adatokat kiírja. Vagy ha pontosabb infó kell, akkor a webservice-be is kell egy hívást tenni, amivel le lehet kérdezni, mennyi ment át. Ez utóbbi megoldás hajaz a fenti php(perl,ruby,lofasz,....) - ajax-os megoldásra is.
De persze nem fontos megoldásban gondolkoznod, nyugodtan fikázz mindenki mást, az egyrészt tuti megoldás, másrészt jobban alszol tőle, még ha nem is jutsz előbbre.
"Van annak elvi akadalya (mint pl php-javascript parosnal) hogy egy web services-os file atvitelnel progressbarral megjelenitsem az atvitel allasat?"
Talan lehettem volna egyertelmubb igy:
"Van annak elvi akadalya, hogy egy web services-os file atvitelnel, AHOL A SERVER ES A KLIENS IS JAVA-s, progressbarral megjelenitsem az atvitel allasat?"
Mentsegemre: ezt itt egy java forum. (de mint mar mondtam, valoban lehettem volna egyertelmubb)
"speciel php-js -nel sincs akadalya :)"
Lehetett volna egyertelmubb a peldam is. Nem az volt a pelda peldaerteke, hogy vekonykliensrol van szo, hanem hogy annak ellenere, hogy te mast mondasz, igen is van akadalya egy php-ajax parosnal a progressbarnak. (Azt gondoltam, hogy ennek az oka "koztudott", ezert ertheto lesz, miert hozom ezt peldanak. Megint nem voltam eleg egyertelmu.)
"nezd meg a web service foltolto metodusa-t, hogyan lehet vele megoldani" Jo, megnezem, hogy hogy lehet vele megoldani. :)))))
"egeszitsd ki/ird at a web service foltolto metodusa-t, hogy tudja ezt." Jo, atirom, hogy tudja ezt. :))))
Azt gondolom, neked fogalmad sincs a dologrol, azert adsz ilyen hasznos tanacsot. Ez egyebken rendben is van, mert peldaul nekem sincs rola fogalmam, hogy lehet megoldani.
En ezert kerdeztem meg itt, a forumom, es te?
Ha megoldom (mert megoldom valahogy) folteszem ide, masok okulasara is.
kis kavar van nalad kliens-kliens temakorben talan. Eloszor php-ajax-ot emlegetsz peldanak, tehat szerver es webes bongeszo kommunikacioja, majd irsz egy peldat egy java progira mint vastag kliens. Talald ki mit akarsz eloszor is.
Ha ez utobbi vastag klienses, akkor nezd meg a web service foltolto metodusa-t, hogyan lehet vele megoldani a kijelzest feltoltes allapotarol, vagy egeszitsd ki/ird at a web service foltolto metodusa-t, hogy tudja ezt.
File file = new File("c:\jasperReports.pdf"); FileDataSource fd = new FileDataSource(file); DataHandler dh = new DataHandler(fd); fws.fileUpload("jasperReports.pdf", dh); //itt fsw.fileUpload a web service foltolto metodusa
ez pedig a letoltes:
DataHandler dh = fws.fileDownload("a.jpg"); // elkerem a web service-tol a file-t File file = new File("e:\xxxx\" + "a.jpg"); OutputStream fos = new FileOutputStream(file); dh.writeTo(fos); fos.close();
Szamomra az a kerdes, mert azt nem tudom, hogy megoldhato-e. Azert kerdeztem ezt, mert evvel kapcsolatban vannak ketelyein. Az vilagos, hogy ha kliensoldalon folszeletelem a filet, akkor tudok egyfajta progressbart varazsolni a proceduraba, bele is kezdenek ebbe a kisse korulmenyes valtozat lekodolasaba, ha "bebizonyosodna" hogy egyszerubben nem oldhato meg.
En ott akadtam el, hogy csinaltoam egy MTOM-os web service-t, amivel kivaloan lehet file-okat foltolteni, letolteni. (egyebkent vastagkliensrol van szo, es ssl-es basic autentikacios mizeria van benne, de ez talan mellekes is) Itt jott a kepbe, hogy kellene progressbar.
Nem az a kerdes, hogy megoldhato-e, mert viszonylag egyszeru. A kerdes az, Te hol akadtal el vele? Az nem derul ki, folyton csak azt kerdezed ilyet csinalt-e mar valaki :) Az a kerdes, hogy Te elkezdted, hol akadtal el?
ez eleg off, de szerintem php-ajax-nal azert van nemi akadaly. Eloszor is, hogy amig a superglobalisok nincsenek meg , addig nem fersz hozza semmihez a serveren, $files[] (vagy mi a turo volt a phpnel ez) pedig superglobalis. Innentol bukik az egesz, mert mire megmukkanna a php-s kodod, mar regen font van a file. Kliens oldalon a javascripttel meg nem lehet szeletekben folkukdeni a file-t. (vannak ezt kikerulni kepes modulok "vagymik" php-hez, de errol szerintem egy webhostingos szolgaltatonal ne is almodjunk). Flash-php az mar mas, olyat csinaltam mar. Szimultan tetszoleges mennyisegu filet fol lehet nyomni. (progressbarral, savszelesseg kijelzessel, stb) (bar szerveroldalon ott is eleg sok buktato van.)
Tehat anelkul, hogy folszeletelnem a filet, megoldhato-e javaban a progressbaros web service-s fol/le toltes? Csinalt valaki ilyet mar? (gugliban nem talaltam csak .NET-es cuccot)
Van annak elvi akadalya (mint pl php-javascript parosnal) hogy egy web services-os file atvitelnel progressbarral megjelenitsem az atvitel allasat?
(anelkul pl. hogy kisebb darabora vagnam a file-t es igy kuldenem at az eteren, es a darabok szamabol es mertebol kalkulalnam a progressabrhoz szukseges ertekeket)
5 masodpercenkent pollozza a mysql servert. Mi lehet ez? Lattatok mar ilyet? Eleg idegesito, mert a mysql server logjat is teleszorja. Mire kellhet ez a glassfishnek?
111128 11:57:35 3038 Connect egyUser@192.168.10.201 on egyTabla 3038 Query /* mysql-connector-java-5.1.13 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect' 3038 Query /* mysql-connector-java-5.1.13 ( Revision: ${bzr.revision-id} ) */SELECT @@session.auto_increment_increment 3038 Query SHOW COLLATION 3038 Query SET NAMES latin1 3038 Query SET character_set_results = NULL 3038 Query SET autocommit=1 3038 Query SET sql_mode='STRICT_TRANS_TABLES'
igen, fel, csak ekkor jon az exception a kliensoldalon:
com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
ezen lehet segiteni ugy, hogy bekerul a certbe a subjectAltName az ip cimmel
(asszem egyebkent, ha ez benne van, alapbol figyelmen kivul hagyjak a CN erteket)
(tobb subjectAltName ertek is lehet benne)
Ugy tunik, hogy keytool arra nem hasznahato, hogy subjectAltName elemet vegyek fol a certbe, csak openssl. Az openssl altal generalt cuccost beimportalhatom keytoollal .jks-be, ezt viszon meg a glassfish nem szereti. itt a vege.
Kerdesed elsosorban a szerializacio temakorebe tartozik, nagyon sok irodalmat fogsz tudni talalni rola a neten. (kulcsszavak: java, serialization)
Az objektumot leirasod szerint adatkuldesre hasznalod, azaz egyedi adatot tartalmaz. Ekkor szerintem teljesen indokolt a peldanyositas (masolas).
Amennyiben nagymennyisegu adatforgalomrol van szo es a memoria lenne a szuk keresztmetszet, akkor el lehet gondolkodni egy resource pool megoldason.
A factory patternt szoktak ilyen esetekben alkalmazni a peldanyositasra es a semaphore-t a eroforras szamlalasara.
Egyebkent ha halozati kommunikaciorol van szo, sokkal valoszinubb hogy a szuk keresztmetszet a kapcsolat savszelessege/sebessege lesz mint a szerveroldali memoria.
Persze ez fugg attol is, hogy mit csinal a program utana a keppel, amennyiben vmi idoigenyes szamitast, ugy mar valtozhat a helyzet.
Vegszokent annyit, hogy ahogy latod nem lehet erre "tuti" valaszt adni, mint a legtobb esetben itt is merlegelni kell a fobb szempontokat es annak megfeleloen donteni/optimalizalni.
A következő problémám van:adott egy thread, ami egy tcp-ip kapcsolatból folyamatosan olvas pl. "EredmenyClass" típusú objektumot.
Az EredmenyClass tartalmaz két byte[] tömböt amelyekben jpeg képek vannak, illetve három int típusú adatmezőt, meg a megfelelő getter metódusokat.
A thread a beérkezett objektumokat egy EventObject-ben elküldi a beregisztrált különböző feldolgozó listener-eknek. És itt a gondom: hogyan adjam át az ilyen jellegű feladatokban az objektumokat?Mert ha az objektumot továbbadom feldolgozásra, de közben a "forrás" metódusban módosítom (nem hozok létre újat a tcp-ip kapcsolaton érkező adatokból, hanem a meglévőbe rakok új adatokat), akkor a feldolgozást végző programrész is hibás, változó adatokat lát (referencia szerinti átadás). Ha viszont mindig új objektumot hozok létre, az memóriaszivárgást okozhat, nem? Folyamatosan gyártok objektumokat, de a GC általi megszüntetésük kérdéses.Mi ilyenkor a szokásos hivatalos, "elegáns" eljárás?Eleve az egész referencia szerinti paraméter átadás egy kicsit ködös nekem, mert ha átadok egy objektumot, amit később valahol módosítok, annak rossz esetben ellenőrizhetetlen következményei is lehetnek. Mi a megoldás? Klónozás?Gondolom ez egy triviális probléma, a Java-val foglalkozó könyvekben mégsem nagyon tárgyalják. Talán mert annyira "alap"? :-)
persze ha a kliens a host fajljaba folveszi a szervert egy neven az adott ip-vel, es a cert-ben ezt a nevet hasznalom, es a wsdl-ben is a <soap:address location ez emlitett hostnevet alkalmazza akkor megy a dolog. dehat nem lehet minden klienst megkerni, hogy irja at a host-fajljat. Nem lehet esetleg a java kodban elerni azt, hogy wsdl-bol megkapott host nevet a host allomany hasznalata nelkul leforditsa ip cimme? Ez talan kerulo megoldasnak jo lenne.
Bocs, az eleje meg lemaradt: kb annyi, hogy webservice-szal kommunikal a vastagkliens a serverrel, es nem a szerverprogi, hanem az alkalmazasszerver autentikaltat.
<auth-method>BASIC</auth-method> <realm-name>webRealm</realm-name> (egy jdbc realm, de ez nem is fontos)
Viszont szertettem volna (ill muszaj) ssl-t tenni a kommunikacio ala, mert hogy igy kodolatlanul mennek a passwordok.
Itt jonnek a borzalmak. A servernek ugyanis nincs hostneve, csak ip cime.
("Change Certificate’s Subject Alternative Value: If you’re connecting to your host by using IP address, then you must change the subject alternative value to your IP address value.")
A kliensnel ott van a keystore.jks, amiben ott van a ket cert, amit a server is hasznal. (glassfish az alkalmazasszerver. a keystore.jks ben van ket cert. Az aliasuk s1as es glassfish-instance).
Ha annak rendje-modja szerint a jdk keytool programjaval megcsinalom a kliens keystore.jks-et, a java kliens azert reklamal, hogy kell neki az alternate name. Tehat ilyenkor a certnek kell tartalmaznia egy ilyesmit:
Ez a feni reszlet viszont a az openssl conf filejanak egy reszelet, ugyanis a keytool-lal nem lehet altName-t beletenni a certbe. (aszongyak a kozertben)
Tehat a keytool helyett kenytelen vagyok openssl-t hasznalni, majd az openssl altal keszitett cuccost a keytoollal importalni
Nna az a vege, hogy megvan a keystore, benne a ket cert megfelelo aliasokkal. Ezt viszont mar a glassfish nem eszi meg.
Itt meg mar valoban elakadtam, hiaba bujtam a netet egy heten keresztul. Abban remenykedem, itt csinalt mar v.ki ilyesmit, azaz hogy host nevvel nem rendelkezo serverrel epitett ki ssl kapcsolatot, es mond valami biztatot.
idoszukeben csak nehany altalanos dolgot illetve linket tudok mondani.
Az egyik site amit tudok javasolni a javapassion.com ami mara fizetosse valt, de egeszen megfizetheto az ara es nagyon sok temakorben ad egesz korrekt tutorialt. Nem utolso sorban sokszor lehet gyorsan snippeteket lopni onnan. :-)
Amugy a vastagklienssel altalaban az van, hogy a funkcionalitas a kliensen belul van, tehat csak a kezdeti autentikacioert fordul a szerverhez. Ez tobbfelekepp megoldhato. Egy gyakori megoldas szokott lenni, h a bejelentkezesnel szerver oldalon generalnak egy session id-t es utana a klienstol erkezo tobbi request ezen a sessionon keresztul tud iro/olvaso muveleteket vegezni (amig a session el). Ilyenkor fontos az ssl, hogy a session id-t ne lehessen sniffelni.
Amit nem szabad komoly alkalmazasnal: visszaterni az autentikacio sikeressegevel es onnantol (sikeres esetben) szabadon vegezheto barmilyen muvelet. Konnyu belatni, h az ilyen szoftvert nem nehez meghekkelni.
Vegul pedig par link csak egy szimpla google utan: