05. februar 2007 - 23:05Der er
18 kommentarer og 1 løsning
Client-Server problem
Jeg ønsker at etablere en client-server relation mellem to maskiner A og B, hvor A skal fungere som client og B som server.
Idet A har fast/kendt IP-adresse, mens B har dynamisk/ukendt IP-adresse (B kører på et lokalt netværk), etableres forbindelsen ved, at B først kalder A op, hvorefter A kalder B op, idet B's adresse nu er kendt.
Jeg bruger flg. klasser: 1. På A findes flg. klasse, som venter på opkald fra B og derefter etablerer forbindelse til B:
Det går fint med, at B kalder A op, og "Hul igennem!" modtages også på B. Men Socket client=new Socket(socket.getInetAddress(),8080) fejler i ClientA-klassen, dvs. A er ikke i stand til at forbinde til B. Det skal her siges, at B kører på et lokalt netværk, hvilket måske kan give problemer, men "Hul igennem!" modtages omvendt fint på B.
Hvad er årsagen til, at A ikke kan forbinde til B, og hvordan løser jeg dette problem?
->arne_v: Jeg får fejlen: java.net.ConnectException: Connection timed out: connect
Jeg undrer mig over, at jeg godt kan modtage "Hul igennem!" som retursvar, når B kalder A op, mens A ikke umiddelbart (selvstændigt) kan forbinde til B - men det har måske noget med firewall'en at gøre, som du skriver.
Men hvis det er tilfældet, kan jeg så på en eller anden måde holde forbindelsen åben, når B kalder A op i stedet for at etablere en ny forbindelse?
->arne_v: Du skriver: "hvorfor lader du ikke bare din server connecte til client ?" Hvad mener du her? Som jeg forstår det, er det netop det jeg forsøger ved at lade B kalde A op først.
->arne_v: Men er client-server forholdet så ikke byttet om? Tanken er jo, at B skal fungere som server og lytte på indkommende beskeder fra A. Derfor skal B vel have ServerSocket til rådighed (?) Hvordan kan B ellers vide, når der er besked fra A?
->arne_v: Jeg roder lidt videre med dit forslag og vender tilbage. Du skrev tidligere "pointen er at B godt kan være client på TCP level og server på app level samtidigt". Hvis jeg forstår dig ret, er sagen, at når B først har connect'et til A (på TCP level), er forbindelsen etableret, og både A og B kan så fungere som client hhv. server, jf. din egen kommentar "sockets er fuld bi directional".
Jeg vil dog (måske lidt dumt) spørge videre: Vil etablering af en sådan åben forbindelse belaste den fysiske forbindelse anderledes end en løsning, hvor clienten foretager reconnect hver gang? - altså koster det noget at have forbindelsen stående åben så at sige?
->arne_v: Så fik jeg endelig tid til at rode lidt videre med det, og du har jo helt ret i, at det er lige så fint, at lade A fungere som server og B som klient. Når først forbindelsen er etableret, fungerer den begge veje, som du skriver. Da ydermere read er blocking, er det ikke nødvendigt, at B foretager løbende request til A, idet B vil tage imod indlæsning, når den kommer fra A. I den sammenhæng vil B "emulere" den server-funktionalitet jeg går efter: Jeg vil gerne have en løsning, hvor B ikke løbende skal requeste mod A, men hvor A "push'er" information til B.
Smid gerne straks et svar, og tak for hjælpen. _______________ Note til mig selv:
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.