/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
URLConnection til server (ikke servlet)
Fra : Ole Storm


Dato : 30-11-00 22:48

Hej,

(Heunder følger en længere historie...)

Jeg nørkler lidt med at lave en Java-klient, der via en URLConnection skal
koble sig op til en ISAPI-dll på en Internet Information Server (hvilket
ville svare til at koble op til en servlet på en WebServer som understøtter
sevlets - hvilket min ikke gør).

Det er i og for sig heller ikke det store problem - nedenstående klasse,
Client, tillader mig at kalde en ISAPI-dll på en IIS og udskrive resultatet.
Fint Nok!

Mit problem består i, at jeg gerne vil lave en Java applikation, der skal
køre lokalt på samme computer som omtalte klient, lytte på en passende port,
8080 f.eks., og så ellers opføre sig som min ISAPI-dll. Ideen er at dette
Java-program, under udviklingen af en mere kompliceret klient, kan gøre det
ud for den 'rigtige' ISAPI-dll (som ligger et sted ude på nettet), så jeg
ikke behøver være on-line hele tiden...

Altså - jeg vil lave en lokal server, der kan 'svare' på URLConnections af
typen:
http://localhost:8080/test.dll?arg1=value1&arg2=value2

mens den 'rigtige' ISAPI-dll kontaktes med noget lignende
http:///test.dll?arg1=value1&arg2=value2

Min server åbner en ServerSocket på port 8080, og hver forbindelse til denne
socket håndteres i en seperat tråd, ClientHandler (se herunder). OG NU TIL
MIT PROBLEM (endelig!): når en klient åbner en URLConnection mod min server,
startes run() metoden godt nok, og klientens GET request begynder at blive
læst af serveren, MEN while-løkken terminerer aldrig (eller i hvert fald
først når jeg slår klienten ned). Jeg når med andre ord aldrig til
slutningen af min input-strøm. Det er kaldet til input.readLine() der
tilsyneladende aldrig returnerer...

På den måde kommer både klient og server til at stå og vente i evigheder -
SUK!


Hvad gør jeg galt? (jeg håber at trods alt nogle stykker af jer holdt ud så
længe...)
For mig at se ser det ud som om det er min server der er problemet. I hvert
fald virker klienten OK sammen med den rigtige ISAPI-dll.

Hilsen,

Ole Storm.


===================================================

import java.net.*;
import java.io.*;
public class Client
{

static void main(String[] arg) throws java.net.MalformedURLException
{
if(arg.length > 0){

try {
URL url = new URL(arg[0]);
URLConnection con = url.openConnection();
con.connect();
BufferedReader input = new BufferedReader(
new InputStreamReader(con.getInputStream()));

String s;
while( (s=input.readLine()) != null)
System.out.println(s);

if(input != null)
input.close();
}
catch(MalformedURLException e){
System.out.println("Malformed url: " + arg[0]);
}
catch(Exception e){
e.printStackTrace();
}
}
}
}



import java.net.*;
import java.io.*;
public class Server
{
static boolean done = false;
static void main(String[] arg)
{
int port = 8080;
InetAddress server=null;

try{
server = InetAddress.getLocalHost();
}catch(UnknownHostException e){}

try{
ServerSocket listen = new ServerSocket(port);
System.out.println("Server started. Waiting for clients");
while(!done){
Socket client = listen.accept();
new ClientHandler(client).start();
}
}
catch(IOException e)
{
System.out.println("Caught IOException: " + e);
}
}
}

class ClientHandler extends Thread
{
Socket socket;

ClientHandler(Socket s)
{
socket = s;
}

public void run()
{
try{
System.out.println("Client listener started...");
BufferedReader input = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));

String s;
while( (s=input.readLine()) !=

 
 
Niels Thrane (01-12-2000)
Kommentar
Fra : Niels Thrane


Dato : 01-12-00 02:07

> socket håndteres i en seperat tråd, ClientHandler (se herunder). OG NU TIL
> MIT PROBLEM (endelig!): når en klient åbner en URLConnection mod min
server,
> startes run() metoden godt nok, og klientens GET request begynder at blive
> læst af serveren, MEN while-løkken terminerer aldrig (eller i hvert fald
> først når jeg slår klienten ned). Jeg når med andre ord aldrig til
> slutningen af min input-strøm. Det er kaldet til input.readLine() der
> tilsyneladende aldrig returnerer...

Dit problem er ganske rigtigt, at du aldrig returnerer fra en readLine()
medmindre forbindelsen afbrydes.
- hvilket egentligt er meningen.

I dit tilfælde bruger du HTTP protokollen, som siger, at du efter din GET
request skal afslutte med to CRLF - som signalerer serveren, at den nu kan
begynde at lave et svar til dig. Du skal altså ikke vente på at klienten
bliver færdig med sende, da det principielt aldrig sker (din
socket-forbindelse forbliver åben).

Når din server har lavet hele siden og sendt den til klienten skal den
(ifølge HTTP specifikationen) afbryde forbindelsen. I så fald vil din
readLine() i klient-delen returnere null og du får muligvis en IOException.

Besvarer det dit spørgsmål?

--
Mvh.
Niels Thrane



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste