Avatar billede swaq Nybegynder
28. marts 2003 - 21:58 Der er 80 kommentarer og
1 løsning

Kommunikation mellem tråde, socket lukkes

Hejsa,

Er i færd med at lave en nameserver og en fileserver. Førstnævnte håndterer en række klienter og ekspederer deres filrequest videre til fileserveren.

Nameserveren fungerer således;
Klassen består af 2 innerclasses; ClientThread og FileServerThread, når en klient logger på oprettes en tråd af ClientThread som styrer kommunikationen mellem klient og server ved hjælp af BufferedReader og OutputStream.
Når klienten beder om en fil opretter ClientThread et objekt/tråd af FileServerThread (alt sammen foregår i nameserver-klassen), denne tråd virker som klient i forhold til fileserveren og kommunikerer ligesom klienten gør med nameserveren. PUHA... det gælder om at holde tungen lige i munden...

Hvor om alting er så virker ovenstående fint således; klienten sender besked til ClientThread i nameserver, denne sender beskeden videre (gennem FileServerThread) til fileserveren som kan læse beskeden (og skrive den ud i sin egen terminal) og sende den retur til FileServerThread i nameserver! (men her knækker filmen så)...

Sagen er, at i nameserver-klassen skal FileServerThread sende beskeden til ClientThread for at denne kan sende via den oprettede socket til klienten (altså kommunikation mellem de to innerclasses/tråde), hvordan fikses den lige???
Jeg har prøvet af parameteroverfører det clientThread-objekt som opretter FileServerThread (således den har en anelse om hvorfra beskeden oprindeligt kom) - hvilket ikke løser problemet. Beskeden skal jo tilbage til klienten og ikke bare huserer i nameserveren.

Den fejl jeg får er;
java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:124)
        at Nameserver.writeLine(Nameserver.java:245)
        at Nameserver.access$400(Nameserver.java:5)
        at Nameserver$ClientThread.responce(Nameserver.java:146)
        at Nameserver$FileServerThread.run(Nameserver.java:193)
        at java.lang.Thread.run(Thread.java:536)

Please help!
Avatar billede arne_v Ekspert
28. marts 2003 - 22:02 #1
Det er jo en lidt kompleks applikation at skulle gennemskue
baseret på de foreliggende oplysninger.
Avatar billede arne_v Ekspert
28. marts 2003 - 22:09 #2
Her er mit bud:

Adskil thread og sockets.

Ingen inner classes.

Drop FileServerThread.

Noget i retning af:
* NameServerMain som lytter på ServerSocket creater ClientThread's
* ClientThread som creater ClientConnection og processer requests fra client
* ClientConnection som indeholder Socket
* FileServerConnection som indeholder Socket

Når der kommer en request fra client om en fil så åbner ClientThread
en FileServerConnection, beder om filen, får filen og sender den
tilbage via ClientConnection.
Avatar billede swaq Nybegynder
29. marts 2003 - 21:12 #3
Hej Arne, sorry mit sene responce, men mit Internet har strejket...

Har lagt koden her;
http://www.wasf.dk/index.php?goPage=files&dir=kode/

Din idé lyder rigtig god, jeg kigger på det, men håber du vil kaste et blik på selve koden.
Avatar billede arne_v Ekspert
29. marts 2003 - 21:17 #4
Jeg prøver lige at kigge på det.
Avatar billede arne_v Ekspert
29. marts 2003 - 21:30 #5
Hm. Det link er mildt sagt langsomt.
Avatar billede swaq Nybegynder
29. marts 2003 - 21:37 #6
Ja, gæt selv hvem der hoster...

cliche.dk - ganske rigtigt gættet - DE STINKER!!!
Avatar billede arne_v Ekspert
29. marts 2003 - 21:43 #7
Kender dem ikke.

Jeg hoster selv.
Avatar billede swaq Nybegynder
29. marts 2003 - 21:45 #8
:-)
God idé, hvad skal du have for et host?
Avatar billede arne_v Ekspert
29. marts 2003 - 21:47 #9
Første kommentarer til koden er:
1)  du krævet JDK 1.4.x
2)  du har absolut for mange tråd klasser
3)  jeg forstår ikke den måde du laver tråde på
Avatar billede arne_v Ekspert
29. marts 2003 - 21:47 #10
Hov. Jeg hoster selv mine egne ting. Jeg hoster ikke for andre.
Avatar billede swaq Nybegynder
29. marts 2003 - 21:50 #11
Hmm... ok...
Min tråd-teknik er sikkert noget underlig og hvis du gider vil jeg gerne lære en smartere måde at arbejde med tråde på... Kan ikke just prale af, at min kodning foregår struktureret :-)

Hvad er der galt med JDK 1.4.x? Eneste der skal laves om i koden for at den virker til tidligere versioner er min en- og decoding hvor formattet i 1.4.x skal med hver gang.
Avatar billede arne_v Ekspert
29. marts 2003 - 21:53 #12
re 3)

Du bruger:

class X implements Runnable {
    public X(...) {
        ...
        start();
    }
    public start() {
        Thread t = new Thread(this);
        t.start();
    }
    ...
}

new X(...);

Hvor de to normale måder er enten:

class X implements Runnable {
    public X(...) {
        ...
    }
    ...
}

(new Thread(new X(...))).start();

eller:

class X implements Extends Thread {
    public X(...) {
        ...
    }
    ...
}

(new X(...)).start();
Avatar billede arne_v Ekspert
29. marts 2003 - 21:54 #13
Der er ikke noget galt med med 1.4.x - jer har også 1.4.1 installeret.

Jeg bemærkede bare at du brugte 1.4.x specifikke metoder.
Avatar billede arne_v Ekspert
29. marts 2003 - 21:55 #14
Sådan noget der skal i 72 punkt understreg fed og kursiv i
releases notes når man releaser.

:-)
Avatar billede swaq Nybegynder
29. marts 2003 - 21:57 #15
hmm... ok... så du opretter altså Thread objektet udenfor den klasse som 'implements Runnable'?
I mit tilfælde betyder det, at jeg skal lave tråd-objektet i nameserver?
Avatar billede arne_v Ekspert
29. marts 2003 - 21:57 #16
Så ser det næsten ud som om du bruger JBuilder. Korrekt ?
Avatar billede swaq Nybegynder
29. marts 2003 - 21:58 #17
Hvordan er du blevet så klog? Bliver tilstadighed overrasket over den viden du sidder inde med, ikke bare i java men også i alle de andre ting du ved noget om... Du er vel - uden det skal lyde klamt - mit yndlings orakel :O)
Avatar billede arne_v Ekspert
29. marts 2003 - 21:58 #18
Ja. Normalt.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:01 #19
Korrekt :-) og dog ikke...

bruger normalt JBuilder, men i dette tilfælde lavede jeg al koden i hånden i TextPad, da jeg sad ved en puter uden JBuilder...
Jeg syntes heller ikke JBuilder egner sig særligt godt hvis man slam-koder... Jeg bruger mest JBuilder fordi jeg er helt tosset med pop-up API'et, det er sku en fræk detalje!
Avatar billede arne_v Ekspert
29. marts 2003 - 22:01 #20
Så du bruger JBuilder.

Det gættede jeg på fordi koden indeholdet:

        }
        catch(Exception e){

De fleste IDE'er laver det som:

        } catch(Exception e){
Avatar billede swaq Nybegynder
29. marts 2003 - 22:02 #21
hø hø... min gamle vane, jeg kalder altid mine exception ved eksotiske navne ligesom; (NullPointerException npe)
Avatar billede arne_v Ekspert
29. marts 2003 - 22:02 #22
Hvis det er lavet i TextPad, så har du en meget meget pæn kode-stil.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:04 #23
ahh... overså lige detaljen med '}'

Jeg mener det er uoverskueligt hvis ikke slut-tuborg holdes på en linie for sig selv :-)
Avatar billede arne_v Ekspert
29. marts 2003 - 22:04 #24
Men med hensyn til hvordan jeg har lært et eller andet, så har jeg arbejdet
fuldtids med IT siden 1987. Man lærer et eller andet undervejs.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:04 #25
taak... måske fordi jeg voksede op med JBuilder... startede med java for 1½ år siden
Avatar billede swaq Nybegynder
29. marts 2003 - 22:09 #26
he he... det har du ret i, kan selv mærke det!

By the way, hvis nu mit lille program her skal virke rigtigt, så skal fileserveren jo sende en fil og ikke en streng (det er for kedeligt). På den måde bliver jeg vel nødt til at oprette 2 strømme mellem nameserver og fileserver, da jeg først skal fortælle fileserveren hvilken fil jeg vil have og siden have den sendt... By the way, så skal den jo helt tilbage til klienten, er det ikke muligt at holde nameserveren udenfor al returkommunikationen?? Det belaster bare den unødigt!

Bla bla bla, nu er jeg blevet varm, så der kommer lige et questiones mere;

hvordan kan jeg designe nameserveren således den med et givent interval opdaterer sit register med filer på fileserveren? hvis nu vi havde 2 eller flere fileservere der løbende ændrer sig, har vi jo brug for at holde nameserveren opdateret...
Avatar billede arne_v Ekspert
29. marts 2003 - 22:14 #27
Du kan godt både læse og skrive til samme socket.

Der skal bare være en helt klar protokol for det.

client sender request for fil
server sender fil
client sender request for fil
server sender fil
...

requests kan du sagtens håndtere med konventionen om at \n
adskiller requests

for filer laver du bare en konvention om at først sendes
4 byte med længden og derefter kommer alle bytene
Avatar billede arne_v Ekspert
29. marts 2003 - 22:16 #28
Du kan ikke flytte en socket fra Nameserver til FileServer.

Jeg ville nok lade det blive som det er.

Alternativet ville være en trekant:
  Klient sender request til Nameserver
  Nameserver sender request til FileServer
  FileServer sende fil til Klient

Og så skulle Klient også have en socket til FileServer
etc. og det vil vist ødelægge hele arkitekturen.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:19 #29
hmm... lyder nemmere sagt end gjort, har mildest talt ikke de store erfaringer med bytes og konventioner som du taler om... findes der eksempler nogen steder på nettet?

Jeg er med på, at jeg kan skrive og sende til samme socket, det var mere selve strømmen jeg tænkte på, eksempelvis BufferedReader osv.
Avatar billede arne_v Ekspert
29. marts 2003 - 22:19 #30
Med hensyn til opdaterimg så kan du vel vælge mellem:

1)  poll

    Nameserver spørger med X sekudners mellem FileServer om
    hvilke filer der er (java.util.Timer !)

2)  push

    FileServer sender en update til Nameserver når det ændrer
    sig (a la Observer Pattern).
Avatar billede swaq Nybegynder
29. marts 2003 - 22:20 #31
ja, det er vist rigtigt nok, den arkitektur der er pt. er vist meget god... Problemet med den er jo bare at nameserver bliver en flaskehals, men det findes der vel teknikker for at undgå... (flere nameservere måske)
Avatar billede arne_v Ekspert
29. marts 2003 - 22:26 #32
Det er nu ret simpelt.

DataInputStream og DataOutputStream !

afsenderen har en DataOutputStream og sender først længden X
med en writeInt og derefter X bytes med normal write

læseren har en DataInputStream og læser først længden X med
en readInt og derefter X bytes med normal read
Avatar billede swaq Nybegynder
29. marts 2003 - 22:27 #33
ok, tror jeg går efter Timer eksemplet, har noget kode i forvejen der virker genialt til lige netop det formål, hvordan skal jeg gøre det i praksis? Lave en særlig tråd der med sin egen socket arbejder med opdatering eller huh?
Avatar billede arne_v Ekspert
29. marts 2003 - 22:30 #34
Timer klassen starter din klasse (som implementerer TimerTask) i
en separat tråd, så du skal bare lave en helt normal klasse, så
laver Java tråden for dig.

På Nameserver siden.

På FileServer siden er det vel bare en halvnormal form for connection.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:34 #35
hø hø, halvnormal... den er vist for advancerede programmørere... jeg er lidt i tvivl :-) en helt normal klasse bruger vel stadig en socket til at kommunikere med fileserveren?
Avatar billede swaq Nybegynder
29. marts 2003 - 22:38 #36
her er den reminderklasse jeg snakkede om;
http://www.wasf.dk/index.php?goPage=files&dir=HA(dat.)/årgang%202002/2.%20semester/Uge%203/Interface/

Undskyld den noget langsomme responce fra sitet, HAR skrevet en klage!
Avatar billede arne_v Ekspert
29. marts 2003 - 22:38 #37
Helt normal socket.

Nameserver vil connecte til FileServer fuldstændigt ligesom requests
for filer.

Men FileServer skal sende en directory listing i.s.f. en fil.

Det er lidt anderledes.

Derfor det skæve udtryk halvnormal.

Det eneste du ikke skal tænke på er tråde. Det sørger Timer for.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:41 #39
ahh... haaar det... jeg tænkte jo straks på at jeg skulle have mig en rigtig lille husbestyrerinde-proces der støvede arkiverne af... men det sørger timer-klassen for, hvilket gør det lidt nemmere. Men fra fileserverens synspkt, kommer der altså to slags klienter på besøg;
timer-klassen som holder nameserveren 'up 2 date' og endeligt de deciderede filerequest
Avatar billede swaq Nybegynder
29. marts 2003 - 22:43 #40
by the way... sætter stor pris på at du gider tage dig tid til det her!!! Det jeg savner mest her i livet (indenfor java-verden) er en kultur ligesom ovre hos php-folket. Tænker især på de mange gatherings og conferences, det ville være great hvis vi her i Danevang eller bare i Københavns-området have en slags 'nørder mødes og udveksler viden og ellers hygger sig'-agtig kultur...
Bare en strøg tanke
Avatar billede arne_v Ekspert
29. marts 2003 - 22:43 #41
Jeg har ihverfald fundet noget i den nuværende Nameserver klasse
som er meget suspekt.

fileserverSocket er erklæret i Nameserver ikke i FileServerThread.

Det går galt.

Fordi så vil multiple threads connecte og close til samme objekt.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:45 #42
ahh... det forklarer helt sikkert den fejl jeg nævner laaaangt oppe i dette forum
Avatar billede swaq Nybegynder
29. marts 2003 - 22:47 #43
jeg mener jeg erklærede den der for at gøre den global... den var oprindeligt kun kendt i FileServerThread-klassen
Avatar billede arne_v Ekspert
29. marts 2003 - 22:48 #44
Måske. Måske ikke. Umiddelbart ville jeg tro at fejlen først kom med
mere end en Klient som requestede samtidigt.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:50 #45
faktisk ikke, jeg har selvfølgelig forsøgt mig med flere klienter samtidigt, men jeg mener rent faktisk at problemet opstår med bare een klient...
Avatar billede arne_v Ekspert
29. marts 2003 - 22:51 #46
Jo men du hver tråd skal jo have sin egen socket ellers går det galt.
Avatar billede arne_v Ekspert
29. marts 2003 - 22:56 #47
Det er derfor jeg ikke er sikker på, at det er skyld i det observerede problem.

Fordi jeg har kunnet genskabe problemet med kun 1 Klient.
Avatar billede swaq Nybegynder
29. marts 2003 - 22:58 #48
ahh... syntes jeg har fået en del AHA-oplevelser ud af vores lille 'chat'...
Skriver du ikke en bog :-) I'll be the first bying it :-)

Så det bliver (i dette tilfælde) FileServerThreads opgave at tildele tråden en socket! Det er egentligt også det der var tanken sådan som koden er nu, men den opretter jo kommunikationen på samme socket... Skal jeg lave et random socket nummer eller hvordan sikrer jeg mig at hver tråd får sin egne socket?
Avatar billede arne_v Ekspert
29. marts 2003 - 22:58 #49
Med hensyn til Java versus PHP, så tror jeg at Java folkene
gennemgående er lidt ældre og hyppigere har faste jobs og de
er nok mere til internet fora'er end get-together's.

Men Java kategorien her på eksperten er ret aktiv.

Hvis vi går uden for landets grænser (og kikker på Java på server)
så er der TSS.
Avatar billede arne_v Ekspert
29. marts 2003 - 23:01 #50
Dit sidste spørgsmål forstod jeg ikke.

server har en ServerSocket der lytter på port X.

klienter har hver sin Socket der alle connecter til port X.

når server accepterer connection laver den en Socket (altså en Socket per connection)

1 ServerSocket + N Socket på server
N Socket på klient

der connectes altid til port X

(der connectes også fra en port, men det sørger Java og operativ systemet
for at find eud af)
Avatar billede swaq Nybegynder
29. marts 2003 - 23:02 #51
har også det indtryk... det virker heller ikke som om jsp og servlet er slået helt vildt igennem... det er skide dyrt at få hostet og der er ikke særligt mange udbydere...
Lidt en skam at man ikke kan bruge det man har lært i java på nettet, men er nødsaget til at scripte gennem asp, php (i nogen tilfælde jsp, men ikke særligt udbredt alligevel)...
Avatar billede swaq Nybegynder
29. marts 2003 - 23:04 #52
ahh... ja, det er da rigtigt nok... jeg blev bare lidt forvirret over det du sagde i '29/03-2003 22:51:57'
Avatar billede arne_v Ekspert
29. marts 2003 - 23:06 #53
JSP/servlet er ikke særligt udbredt til rene "vis" løsninger
og er derfor ikke særligt udbredt på web-hoteller som
typisk får "vis" løsninger.

JSP/servlet er særdeles udbredt (som frontend) til "transaktions"
løsninger. Men sådanne skal jo i sagens natur hostes hjemme i firmaet
fordi de skal forbindes med resten af firmaets IT systemer.
Avatar billede arne_v Ekspert
29. marts 2003 - 23:06 #54
Ja men det var Socket objekt.
Avatar billede swaq Nybegynder
29. marts 2003 - 23:09 #55
klart... men til at øve sig ville det være rart med et host (der er til at betale)
Nu vi er ved emnet, hvilken web-server anbefales hvis man vil lege lidt med jsp og servlets? Apache rygtes at være bedre end Tomcat, men jeg ved ærligt talt ikke meget om det - andet end jeg gerne vil prøve det lidt af...
Avatar billede arne_v Ekspert
29. marts 2003 - 23:09 #56
Og helt ærligt så er JSP nok også sværere at komme igang med end
ASP og PHP.

Hvis man skal være god til JSP, så skal man faktisk vide en
hel del om Java, servlets og en masse andre ting.

JSP tiltaler ikke gør-det-selv-hjemmeside-programmøren.
Avatar billede swaq Nybegynder
29. marts 2003 - 23:10 #57
ok, nu tror jeg, jeg fatter noget... problemet er, at jeg lader klienttråden i nameserveren bruge samme Socket-objekt, fremfår at de får hver deres objekt at lege med...
Avatar billede arne_v Ekspert
29. marts 2003 - 23:11 #58
Og lidt synd fordi JSP/servlets er faktisk en kanon stærk teknologi.

For erfarne programmører langt bedre end ASP og PHP.

(MS har dog forbedret sig med ASP.NET)
Avatar billede arne_v Ekspert
29. marts 2003 - 23:13 #59
For at lege med JSP/servlet skal du have en såkaldt
JSP/Servlet engine.

Den mest brugte er Tomcat som er gratis. Der er også alternativer.

Man kan så enten connecte direkte fra browser til JSP/Servlet engine.

Eller man skyde en web-server ind imellem:

browser----web-server----JSP/Servlet engine

web-server vil typisk være Apache men IIS kan også bruges.
Avatar billede swaq Nybegynder
29. marts 2003 - 23:15 #60
kender ikke til .net, men har hørt meget godt om det (selvom det er 'made in M$'land')

Jeg er af den overbevisning, at fatter man bare en smule java, klasser, polymorfi, rekursion osv... så kan man lave nogle interessante løsninger i jsp/servlet.
PHP har jo nærmest udviklet sig i samme retning hvad angår klasser, objekter o. lign.
Avatar billede arne_v Ekspert
29. marts 2003 - 23:18 #61
Den gennemsnitlige hjemme-side programmør mener at Java er noget man
laver applets i, han har hørt om klasser og tror at polymorfi må være
en lokal skik i polynesien.

:-)
Avatar billede swaq Nybegynder
29. marts 2003 - 23:19 #62
tror jeg skal lege lidt med det en dag :-)

vil smutte i seng...

Tusinder tak for din hjælp i dag, det var lige hvad jeg manglede... nu håber jeg bare jeg kan få skidtet til at du! Hvis du finder noget grelt på et senere tidspunkt må du meget gerne poste det :-)

Venligst

Lars
Avatar billede arne_v Ekspert
29. marts 2003 - 23:22 #63
Jeg tror som sagt at det vil umagen værd at omstrukturere lidt kraftigt
jævnfør mit oprindelige svar.

Man kan faktisk godt lave simple multithreaded apps, hvis man
får det hele skruet rigtigt sammen.
Avatar billede swaq Nybegynder
29. marts 2003 - 23:22 #64
hæhæ, enig!

der findes rigtigt slam og så alle de elegante løsninger!

eller som en af mine elever plejer at sige;
"There are 10 types of people in this world. Those who know binary and those who don't.
"
Avatar billede swaq Nybegynder
29. marts 2003 - 23:28 #65
det tror jeg på, det kan bare være lidt svært at holde overblikket i programmet, men så er det godt at du er til :-)

For lige at summere op;
Klient.java forbliver uændret
NameServer.java ændres således;
FileServerThread-innerklassen fjernes
ClientThread-klassen (CT) laves outer og der oprettes en tråd af denne i nameserver-klassen når en klient logger på. CT sørger for at lave en connection til FileServer (behøves ikke være en tråd)
-- kommer lidt i tvivl her... kan jeg være sikker på, at når nameserver opretter en CT, så bliver det socket objekt der oprette i CT ikke delt mellem de forskellige CT's? (min pointe er, at den kode der skal laves i CT, blot skal oprette et socket-objekt uden at tænke på at den er en del af et større multi-threading program?)
Jeg forudsætter at der ikke opstår socket-problemer...

Som verden så ser ud, så har jeg problemer med at lade CT-tråden svarer den oprindelige klient, hvordan ved denne tråd hvilken klient der i sin tid connectede nameservere???
Avatar billede arne_v Ekspert
29. marts 2003 - 23:34 #66
Nameserver laber:
  Socket sock = servsock.accept();
  (new ClientThread(sock)).start();
så får hver ClientThread sin egen Socket.

ClientThread opretter så en Socket til FileServer. Den Socket
kan bare være en lokal variabel inde i en metode. connect/x reads/close.
Det den læser skriver den tilbage til Socket objektet den gemte i sin
constructor (og som har forbindelsen til klienten).
Avatar billede swaq Nybegynder
29. marts 2003 - 23:38 #67
lige præcis det jeg har haft problemer med... ALtså at skrive tilbage til klienten. Jeg fik fejlen (socket closed) men jeg må lige sove på det, ændre koden som du har sagt og se om ikke der sker noget :-)

Endnu engang mange tak, vi 'snakkes'
Avatar billede arne_v Ekspert
29. marts 2003 - 23:41 #68
Med noget a la:

public class ClientThread extends Thread {
    private Socket clientSock;
    public ClientThread(Socket closck) {
      clientSock = clisck;
    }

så kan alle metoder i CT jo skrive tilbage til klienten.
Avatar billede swaq Nybegynder
30. marts 2003 - 18:57 #69
Hej Arne, angående 29/03-2003 22:38:28

Så er jeg lidt i tvivl om hvordan fileserver kender forskel på hvem der connecter til den. Sagen er jo, at de mange tråde i Nameserveren opretter forbindelse til Fileserveren mhp. udlevering af en given fil. Derudover findes der én connection fra nameserver til fileserver som timeren styrer, der hele tiden (eller i et vist interval) spørger Fileserveren om sit indhold. (det er dog ikke kodet endnu).

Hvordan håndteres det i Fileserveren?

Derudover; et spørgsmål ang. trådene. Hvordan holder Nameserveren styr på de tråde den starter? Findes der en måde hvorpå trådene kan dele information, det kunne eksempelvis være listen over fileserverens indhold. Kan en tråd fortælle nameserveren (som jo oprettede den) at den er færdig og dræbt?
Avatar billede arne_v Ekspert
30. marts 2003 - 19:11 #70
FileServer gør ligesom Nameserver: listen på ServerSocket på port,
accept connection og create Socket, send Socket med over i ny Thread.

Den nye Thread skriver bare til den socket og så ender data hos den rigtige
Thread ovre i Nameserver.
Avatar billede swaq Nybegynder
30. marts 2003 - 19:12 #71
Avatar billede arne_v Ekspert
30. marts 2003 - 19:12 #72
Hvis der er et fast natal tråde kan du bare have et Thread[] og
gemme deri.

Hvis det er et variabetl antal kan du gemme i en ArrayList.
Avatar billede arne_v Ekspert
30. marts 2003 - 19:14 #73
Data kan deles på mange måder.

Man kan smide ne referance til en HashMap eller ArrayList med over
til constructoren i Thread klasserne.

Eller man man smide en referance til main objektet med over i
constructoren og så kan trådene kalde metoder i det.
Avatar billede swaq Nybegynder
30. marts 2003 - 19:15 #74
ok, den er jeg med på, men hvad nu hvis trådene i nameserver skal bruge den liste som en helt anden tråd i nameserver (timer-fidusen) laver? Skal listen så overføres på linje med socket?

Jeg kunne også godt tænke mig at vide om en tråd fra nameserver havde mulighed for at 'notify' nameserver når den var færdig... Altså lidt ligesom i C, hvor en proces har en parent?
Avatar billede swaq Nybegynder
30. marts 2003 - 19:19 #75
ahh... dvs. noget i denne her retning;

//ClientConnection-klassen - en tråd
...
public ClientConnectionNameserver(Socket socket, Nameserver parent){
  this.socket = socket;
  //Dermed opnås adgang til parents metoder og variable, eksempelvis
  //en liste med filnavne
  this.parent = parent;
}
...

//Nameserver-klassen
...
  ClientConnectionNameserver ccn = new ClientConnectionNameserver(
            socket, this);
...
Avatar billede arne_v Ekspert
30. marts 2003 - 19:34 #76
re 19:15:54

Ja.

Der er flere muligheder for at markere at Thread er done. En meget simpel
er at have en isDone metod ei thread klassen og lade main thread have
en referance til objektet og teste via isDoen metoden.
Avatar billede arne_v Ekspert
30. marts 2003 - 19:34 #77
re 19:19:21

Præcis.

Det er meget ofte en god måde at gøre det på.
Avatar billede swaq Nybegynder
30. marts 2003 - 19:58 #78
Thanx man :-) Altid rart at blive klogere!
Avatar billede swaq Nybegynder
30. marts 2003 - 20:14 #79
Ang. 19:11:49, går ud fra at du mener, at fileserverens run-metode skal være så generisk at den både kan håndterer liste-opdaterings-forespørgsler og filerequests?
Jeg er lidt i tvivl om hvordan den fikses! Når timeren sætter ind skal den have en streng eller en eller anden form for liste retur indeholdende en opdateret filliste. Men når ClientConnectionNameserver kommer på banen, hvilket vel er det der sker 9 ud af 10 gange, skal der sendes noget helt andet retur... Svært at gøre generisk...

Det ville være federe hvis fileserveren havde mulighed for at skelne.
Avatar billede arne_v Ekspert
30. marts 2003 - 20:18 #80
Du laver en lille protocol.

Nameserver -> FileServer er en en linie kommando, enten
  GET filnavn
eller
  DIR

FileServer laver en readLine og ser hvilken komamndo det er og kalder
to forskellige metoder alt efter hvad det er.
Avatar billede swaq Nybegynder
30. marts 2003 - 20:28 #81
haaaaar det! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester