- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个简单的 HTTP 服务器来处理来自浏览器的请求并返回适当的答案。我已经实现了基本连接,但在正确构建返回 header 以便浏览器可以显示来自服务器的答案时遇到了困难(例如,从服务器获取 .jpg 图片并正确显示)。
我认为我遇到的问题与未正确构建答案 header 有关。我对此缺乏经验,希望得到任何帮助。
下面是我的 HttpHandler 类,它处理来自浏览器的请求并返回答案。我认为问题出在 httpHeaderConstructor 方法中的某个地方。
package Server;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.io.FilenameUtils;
public class HttpHandler {
public static void httpHandler(BufferedReader clientInput, DataOutputStream serverResponse){
int type_of_method = 0;
String path = new String();
try{
String tmp = clientInput.readLine();
String tmp2 = new String(tmp);
tmp.toUpperCase();
System.out.println("Clients request call:" + tmp);
if(tmp.startsWith("GET"))
type_of_method = 1;
if(type_of_method == 0){
try{
serverResponse.writeBytes(httpHeaderConstructor(501, 0));
serverResponse.close();
return;
}catch(Exception e){
System.out.println("1.Error: " + e.getMessage());
}
}
int start = 0;
int end = 0;
for(int a = 0; a < tmp2.length(); a++){
if(tmp2.charAt(a) == ' ' && start != 0){
end = a;
break;
}
if(tmp2.charAt(a) == ' ' && start == 0){
start = a;
}
}
path = tmp2.substring(start + 2, end);
System.out.println("Requested file path: " + path);
}catch(Exception e){
System.out.println("2.Error (bad request Exception): " + e.getMessage());
}
System.out.println("Client requested: " + new File(path).getAbsolutePath());
sendRequestedFile(path, serverResponse);
}
private static void sendRequestedFile(String filePath, DataOutputStream srvResponse){
FileInputStream requestedFile = null;
try{
requestedFile = new FileInputStream(filePath);
System.out.println("File found and opened successfully");
}catch(Exception e){
try {
System.out.println("Could not find file!");
srvResponse.writeBytes(httpHeaderConstructor(404, 0));
srvResponse.close();
} catch (Exception err) {
System.out.print("Error: Can't send failed response!");
System.out.print("Error message: " + err.getMessage());
}
}
String fileExtension = "." + FilenameUtils.getExtension(filePath);
int fileType = 0;
if(fileExtension.equalsIgnoreCase(".jpg") || fileExtension.equals(".jpeg"))
fileType = 1;
if(fileExtension.equals(".gif"))
fileType = 2;
if(fileExtension.equals(".zip"))
fileType = 3;
try {
srvResponse.writeBytes(httpHeaderConstructor(200, fileType));
srvResponse.close();
requestedFile.close();
} catch (Exception e) {
System.out.println("Error message: " + e.getMessage());
}
}
private static String httpHeaderConstructor(int returnCode, int typeOfFile){
String s = "HTTP/1.0";
switch (returnCode) {
case 200:
s += "200 OK";
break;
case 400:
s += "400 Bad Request";
break;
case 403:
s += "403 Forbidden";
break;
case 404:
s += "404 File not found";
break;
case 500:
s += "500 Internal server error";
break;
case 501:
s += "501 Not implemented";
break;
}
s = s + "\r\n";
s = s + "Connection: closing...\r\n";
s = s + "Server: Java HTTP Server v0.1\r\n";
switch (typeOfFile) {
case 0:
break;
case 1:
s = s + "Content-Type: image/jpeg\r\n";
break;
case 2:
s = s + "Content-Type: image/gif\r\n";
break;
case 3:
s = s + "Content-Type: application/x-zip-compressed\r\n";
break;
default:
s = s + "Content-Type: text/html\r\n";
break;
}
s = s + "\r\n";
System.out.println("The returning header is: " + s);
return s;
}
}
<小时/>
这是程序正在构建的 header :
HTTP/1.0 200 OK
Connection: close
Server: Java HTTP Server v0.1
Content-Type: image/jpeg
这些是浏览器中显示的 HTML 标记:
<html>
<head></head>
<body>
<img src="http://localhost:6565/Moon.jpg" alt="The image “http://localhost:6565/Moon.jpg” cannot be displayed because it contains errors."></img>
</body>
</html>
这就是当您尝试获取 .jpeg 图像时发生的情况。
最佳答案
首先,考虑来自 here 的示例响应 header
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "3f80f-1b6-3e1cb03b"
Content-Type: text/html; charset=UTF-8
Content-Length: 131
Connection: close
其次,更改您的函数httpHeaderConstructor
private static String httpHeaderConstructor(
int returnCode, int typeOfFile) {
// You should use a StringBuilder.
StringBuilder sb = new StringBuilder("HTTP/1.0 "); // <--
// Missed
// space.
switch (returnCode) {
case 200:
sb.append("200 OK");
break;
case 400:
sb.append("400 Bad Request");
break;
case 403:
sb.append("403 Forbidden");
break;
case 404:
sb.append("404 File not found");
break;
case 500:
sb.append("500 Internal server error");
break;
case 501:
sb.append("501 Not implemented");
break;
}
sb.append("\r\n");
sb.append("Connection: close\r\n"); // <-- Not closing
sb.append("Server: Java HTTP Server v0.1\r\n");
switch (typeOfFile) {
// case 0: // <-- Not a good idea.
// break;
case 1:
sb.append("Content-Type: image/jpeg\r\n");
break;
case 2:
sb.append("Content-Type: image/gif\r\n");
break;
case 3:
sb.append(
"Content-Type: application/x-zip-compressed\r\n");
break;
default:
sb.append("Content-Type: text/html\r\n");
break;
}
sb.append("\r\n");
System.out.println("The returning header is: " + sb.toString());
return sb.toString();
}
关于java - 为 Java HTTP 服务器构建 http header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20889076/
我在让“@header”或任何其他@规则在ANTLR中工作时遇到麻烦。具有非常基本的语法,如下所示: grammar test; options { language = CSharp2;
我对来源和寄宿有疑问 我有一个ajax页面“Page A”,它将称为ajax提要“Page B” 我看到来自ajax调用的“页面B”的请求 header 具有源“http://mydomain.com
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我想在主机将它们发送到网络之前修改数据包头(IP 头、TCP 头)。 例如,如果我使用 firefox 进行浏览,那么我想拦截所有来自 firefox 的数据包并修改 IP/TCP header ,然
我的 header 内容被包装到#header 中,但是当我设置边框显示结构时,它显示我的#header 的内容出现在#header 本身之后。可能是什么问题?这是我的代码: #header { bo
我是一名 Web 开发人员,使用过 PHP 和 .NET。有一年多的 Web 工作经验,我一直无法彻底了解浏览器缓存功能,希望这里的 Web Gurus 可以帮助我。我心中的问题是: 浏览器实际上是如
伙计们,我有一个问题,我不知道如何在一个 header 中连接多个 header ,我们称它为“主 header ”并使用该 header 中的函数,例如 // A.h #include class
我有一个包含 SOAP 消息的 XMLHTTPRequest。 我想添加用于标识消息并将由 C# Web 服务使用的 guid。 GUID 的目标是识别特定用户,并应护送所有用户请求以在服务器上进行身
我一直在阅读粘性标题,这是我目前所发现的。第一个粘性 header 效果很好,但是当它遇到第一个 header 时,我如何向上滚动第一个 header 并使第二个 header 卡住? http://
我想将当前基于 TableView 的数据网格转换为新的 UICollectionView 类。 这就是我当前的网格的样子: 我的网格有两个标题: 年份(2006a、2007a 等)和 类型(“收入”
我目前正在使用 Apollo 服务器。我正在尝试在响应 header 中设置一个属性。并且此属性是从客户端 graphQL 请求 header 中检索的。 我在网上查了一下。并看到了诸如使用插件或扩展
我的 Controller 的方法需要设置一个标题,例如X-Authorization .创建新对象( store Action )后,我执行转发以显示新创建的对象( show Action ): $
我正在研究一些关于 VLAN 的事情,发现了 VLAN 标签 和 header 。 如果我们有标准 802.3 以太网帧 的 MTU(1518 字节), header 802.3 中包含什么? 另外,
我是放心和 Java 的新手,我正在尝试做一个非常基本的测试来检查 API 的响应是否为 200 ok。 谁能告诉我我需要在下面的脚本中更改什么才能传递多个 header Id、Key 和 ConId
在我的项目中,我需要知道 zlib header 是什么样的。我听说它相当简单,但我找不到 zlib header 的任何描述。 例如,它是否包含魔数(Magic Number)? 最佳答案 zlib
我正在使用 JMeter 测试 HTTP 服务器,该服务器接受并验证 APIKey 并在成功时返回一个有时限的 token 。如果我有 token ,我想发送一个 token ;如果没有,我想发送一个
以太网 header 是什么样的? 是吗: 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|
我们的应用程序支持 CORS 配置 header 。我在两个不同的主机上分别配置了 testApp。两种设置都相互独立工作。host1 上的应用程序配置有 CORS header Access-Con
tlhelp32.h 不包含 windows.h 本身是有原因的吗?我一直在与大量的编译器错误作斗争,因为我在包含 tlhelp32.h 之后包含了 windows.h。这是设计决定还是出于什么原因?
我是一名优秀的程序员,十分优秀!