Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在简单Java套接字服务器中发送结束块?_Java_Http Headers_Chunked Encoding_Chunked_Transfer Encoding - Fatal编程技术网

如何在简单Java套接字服务器中发送结束块?

如何在简单Java套接字服务器中发送结束块?,java,http-headers,chunked-encoding,chunked,transfer-encoding,Java,Http Headers,Chunked Encoding,Chunked,Transfer Encoding,我有一个服务器a,它使用Httpcore、HttpcoreNIO进行HTTP通信。我已经编写了一个简单的Java套接字服务器B,用作后端 public void run() { String expectedResponse = "HTTP/1.0 200 OK\r\nServer: testServer\r\n" + "Content-Type: text/html\r\n&quo

我有一个服务器a,它使用Httpcore、HttpcoreNIO进行HTTP通信。我已经编写了一个简单的Java套接字服务器B,用作后端

public void run() {
        String expectedResponse = "HTTP/1.0 200 OK\r\nServer: testServer\r\n" +
                                  "Content-Type: text/html\r\n" +
                                  "Transfer-Encoding: chunked\r\n" +
                                  "Transfer-Encoding: chunked\r\n" +
                                  "\r\n" + "<HTML>\n" + "<!DOCTYPE HTML PUBLIC " +
                                  "\"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" +
                                  "<HEAD>\n" + " <TITLE>Hello World</TITLE>\n" +
                                  "</HEAD>\n" + "\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                                  "<H1 ALIGN=\"CENTER\"> Hello</H1>\n" +
                                  "Sample text 123\n" +
                                  "test 123:\n" + "<PRE>";
        try {
            serverSocket = new ServerSocket(port);
            System.err.println("Server starting on port : " + port);
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.err.println("Client connected");
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                while (true) {
                    String s;
                    if ((s = in.readLine()) != null) {
                        System.out.println(s);
                        if (!s.isEmpty()) {
                            continue;
                        }
                    }
                    out.write(expectedOutput);
                    System.err.println("connection terminated");
                    out.close();
                    in.close();
                    clientSocket.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
public void run(){
String expectedResponse=“HTTP/1.0 200 OK\r\n服务器:testServer\r\n”+
“内容类型:text/html\r\n”+
“传输编码:分块\r\n”+
“传输编码:分块\r\n”+
“\r\n”+“\n”+“\n”+
“\n”+“你好,世界”\n”+
“\n”+“\n”+“\n”+
“你好\n”+
“示例文本123\n”+
测试123:\n“+”;
试一试{
serverSocket=新的serverSocket(端口);
System.err.println(“服务器在端口上启动:“+端口”);
while(true){
Socket clientSocket=serverSocket.accept();
System.err.println(“客户端连接”);
BufferedReader in=新的BufferedReader(新的InputStreamReader(clientSocket.getInputStream());
BufferedWriter out=新的BufferedWriter(新的OutputStreamWriter(clientSocket.getOutputStream());
while(true){
字符串s;
如果((s=in.readLine())!=null){
系统输出打印项次;
如果(!s.isEmpty()){
继续;
}
}
输出。写入(预期输出);
系统错误println(“连接终止”);
out.close();
in.close();
clientSocket.close();
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
当服务器A从后端B接收到响应时,我得到以下异常

块编码消息正文过早结束:应关闭块

Httpcore似乎希望在关闭连接之前有一个关闭块(或零长度块)


有人能告诉我如何从上面的Java Simple Socket服务器发送这个结束块吗?

传输编码分块http头意味着您正在分块发送http正文。 每个块都以一个以字节为单位的“头”和“/r/n”开头,然后是块本身。 完成后,应发送“0”和“/r/n”

顺便说一句,您发送两次“传输编码块”http头有什么原因吗?

非常感谢。发送“0”和“/r/n”有效。是的,发送两次标题是故意的。我尝试编写一个测试用例,其中后端返回重复的头:)。