Hi,
Working with HTTP servers written in Java, I've hit upon
a stumbling block, where all Linux JVMs I've tested work
quite differently from the Win32-ones:
I've written a small Java webserver (attached).
This accepts both GET and POST events,
and under Win32 this works fine.
However, if I run under Linux (tested: Blackdown, IBM),
when I POST to the webserver, the browser almost always receives a
"connection reset by peer" message-
It seems that whenever the server receives a POST message,
it will prematurely close the socket connection to the browser
- even though flush() has been called.
A workaround is to add a long delay before closing the socket,
but this is clearly not acceptable.
Can anyone explain why the Linux VMs work in this way?
Does anyone know of a workaround?
Thanks,
-Jesper Juul
Soup.dk
Source code:
******************
import java.net.*;
import java.io.*;
import java.util.*;
/**
MicroWebServer2 testing POST events under Linux.
@author Jesper Juul - [EMAIL PROTECTED]
*/
public class MicroWebServer2
{
int port=81;
public static void main(String args[])
{
MicroWebServer2 mws=new MicroWebServer2();
mws.doIt();
}
public void doIt()
{
try
{
ServerSocket sso=new ServerSocket(port);
System.out.println("MicroWebServer2");
System.out.println("Waiting for sockets connections on port "+port);
while(true)
{
Socket so=sso.accept();
new HTTPHandler(so).start();
}
}
catch(Exception e)
{
System.out.println("ServerSocket error: "+e);
}
}
}
class HTTPHandler extends Thread
{
Socket so;
HTTPHandler(Socket so)
{
this.so=so;
}
int linecount=0;
public void run()
{
try
{
DataInputStream dis=new DataInputStream(so.getInputStream());
boolean post=false;
String firstline=null;
int readlen=0;
while(true)
{
String s=dis.readLine();
//System.out.println("Line: "+s);
if (firstline==null)
{
firstline=s;
if (s.startsWith("POST ")) post=true;
}
if (s.startsWith("Content-Length:"))
{
StringTokenizer st=new StringTokenizer(s," ");
st.nextToken();
readlen=Integer.parseInt(st.nextToken().trim());
}
if ((s==null)||(s.length()==0)) break;
linecount++;
}
if (linecount==0)
{
System.out.println("Got empty request!");
}
else
{
DataOutputStream dos=new DataOutputStream(so.getOutputStream());
if (post)
{
byte data[]=new byte[readlen];
dis.readFully(data);
String text=new String(data);
System.out.println("POST: "+text);
}
else
{
System.out.println("GET: "+firstline);
}
String out="<html><body>MicroWebServer2!</body></html>";
String header = "HTTP/1.0 200 OK\n" +
"Allow: GET, POST\n"+
"MIME-Version: 1.0\n"+
"Content-Length: " + out.length() +
"\n\n";
dos.writeBytes(header);
dos.writeBytes(out);
dos.flush();
dos.close();
System.out.println("Done!");
}
}
catch(Exception e)
{
System.out.println("HTTPHandler err: "+e);
}
}
}
********
Sample form to post:
**********
<html>
<head>
<title>Feedback form</title>
</head>
<body bgcolor="#ffffff">
<form action="http://localhost:81/test" method="POST">
<input type="text" name="textfield" value="some text">
<input type="submit" name="send" value="send">
</form>
</body>
</html>
***********************************
soup.dk
Online games and chat
Oehlenschlaegersgade 66, 3.th.
DK-1663 Copenhagen V
Denmark
+45 33 24 81 62
----------------------------------------------------------------------
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]