2016-07-27 146 views
1

我使用com.sun.net.HttpServer类构建与像下面的Java HTTP服务器:的java:HTTP服务器和客户端之间的HTTP会话

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.concurrent.Executors; 

import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

public class SimpleHttpServer { 

    public static void main(String[] args) throws Exception { 
    HttpServer server = HttpServer.create(new InetSocketAddress(8989), 0); 
    server.createContext("/", new MyHandler()); 
    server.setExecutor(null); // creates a default executor 
    server.start(); 
    } 

    static class MyHandler implements HttpHandler { 
    public void handle(HttpExchange t) throws IOException { 

     //Read the request 
     InputStream in = httpExchange.getRequestBody(); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(in, writer); 
     String inputString = writer.toString(); 

     //prepare the response 
     httpExchange.sendResponseHeaders(200, "Hi my faithful client".length()); 
     OutputStream os = httpExchange.getResponseBody(); 
     os.write("Hi my faithful client".getBytes()); 
     os.close(); 
    } 
    } 
} 

我这个通信使用此客户端的服务器:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class Main { 
    public static void main(String argv[]) throws IOException{ 
     String urlstr = "http://127.0.0.1:8989"; 
     URL url = new URL(urlstr); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoOutput(true); 

     OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
     writer.write("Hello HTTP server!! I'm your client1"); 

     InputStream in = connection.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder result = new StringBuilder(); 
     String line; 
     while((line = reader.readLine()) != null) { 
      result.append(line); 
      System.out.println(result.toString()); 
     } 
    } 
} 

并且它正在工作。 但我现在想要的是服务器允许客户端与他沟通一个会话,这意味着一系列的请求/响应不仅仅是一个。所以这将是一个请求/响应的循环。为此,我尝试添加第一步,向客户端添加下面两行:

writer.flush(); 
writer.write("Hello HTTP server!! I'm your client2"); 

但它不起作用。只有第一个请求被服务器捕获。

如何更改代码以实现我的目的?

+0

请我需要一个答案。并提前感谢你。 –

+0

例如,您是否需要执行另一个请求,或者您需要使用Cookie进行会话管理。 –

+0

@CássioMazzochiMolin这是一个会话。只是客户端和服务器之间请求/响应的简单顺序。 我在示例中添加到客户端的其他请求只是两个请求会话的尝试。如果它适用于2个请求,那么它也可以用于3,4,... 以相同的方式 –

回答

1

请检查下面的代码:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 
public class Test1 { 

static String urlstr = "http://127.0.0.1:8989"; 
public static void main(String argv) throws IOException{ 
    URL url = new URL(urlstr); 
    Test1 t = new Test1(); 
    for (int i = 0; i < 10; i++) { 
     t.sendRequest("Hello HTTP server!! I'm your client" + i, url); 
    } 

} 

private void sendRequest(String strToSend, URL url) throws IOException{ 

    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setDoOutput(true); 

    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
    writer.write(strToSend); 

    InputStream in = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder result = new StringBuilder(); 
    String line; 
    while((line = reader.readLine()) != null) { 
     result.append(line); 
     System.out.println(result.toString()); 
    } 
} 

}

+0

谢谢你的作品 –

相关问题