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()) !=