Reputation: 153
I have implemented a very, very simple Java server, which basically listens for all requests on port 8080 and writes them to the console.
My code works fine, once. But for each app restart, the server will only take one request. Can anybody help me?
Server code:
public class RunServer {
public static void main(String[] args) {
final int port = 8080;
final String path = "/android";
try {
HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); //Create the server to listen for incoming requests on the specified port
server.createContext(path, new HttpHandler() { //Set a handler for incoming requests to the specific path
@Override
public void handle(HttpExchange arg0) throws IOException { //This method is called when new requests are incoming
InputStreamReader isr = new InputStreamReader(arg0.getRequestBody(),"utf-8");
BufferedReader br = new BufferedReader(isr);
String query = br.readLine();
System.out.print(query);
} });
server.setExecutor(null); //Default executor. Other executors may be used to e.g. use a threadpool for handling concurrent incoming requests.
server.start(); //Start the server.
} catch (Exception e) {
e.printStackTrace();
}
}
}
I am using this client to post to my server:
public class MyAsyncTask extends AsyncTask<String, String, Void>{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://192.168.1.5:8080/android");
String s;
@Override
protected Void doInBackground(String... params) {
// Building post parameters
// key and value pair
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
nameValuePair.add(new BasicNameValuePair("email", "[email protected]"));
nameValuePair.add(new BasicNameValuePair("message",
"Hi, trying Android HTTP post!"));
// Url Encoding the POST parameters
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
} catch (UnsupportedEncodingException e) {
// writing error to Log
e.printStackTrace();
}
// Making HTTP Request
try {
HttpResponse response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
}
return null;
}
}
Upvotes: 1
Views: 160
Reputation: 1021
It'd be better to use something like Jetty or Tomcat if you are going to be doing any, marginally serious Java HTTP serving.
If you're going to insist on using HttpServer, not actually really know it, I suspect it has to do with the single-threaded nature of HttpServer in it's default configuration and the socket being kept open & waiting for a period of time after. It may also be that you aren't correctly closing the HttpClient in your Android client, and so it keeps the connection open to the server and so the server is tied up waiting for that client.
Upvotes: 1