我正在制作一个文本游戏,需要将一个对象(地点)上传到Java web服务器。(玩家需要共享数据,但这里不关心安全性)我正在使用java。网http API。我目前的方法是
public void sendNewPlace(Place place) {
HttpRequest.BodyPublisher publisher =
HttpRequest.BodyPublishers.ofInputStream(() -> {
PipedInputStream in = new PipedInputStream();
ForkJoinPool.commonPool().submit(() -> {
try (PipedOutputStream out = new PipedOutputStream(in)) {
return place;
}
});
return in;
});
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://127.0.0.1:410/Places/Send/"))
.POST(publisher)
.build();
try {
client.send(request, HttpResponse.BodyHandlers.discarding());
} catch (IOException | InterruptedException e) {
System.out.println("Error: " + e + ", please contact game admin.");
}
}
但这会抛出java。伊奥。IOException:分块传输编码,状态:在
。我真的不知道该怎么解决这个问题,所有的教程和StackOverflow问题要么使用大量的第三方API,要么使用过时的代码(java 9之前的版本),要么想要发送字符串或int之类的东西。这些都是无益的。我不太确定这段代码是做什么的,我在一个教程或问题中找到了它,并对其进行了修改。我想我不想尝试使用JSON,我试图不使用第三方库。如果你想知道,我的服务器代码如下:客户端上读取_LENGTH
。send()
public void makePlacesRecieveContext() {
server.createContext("/Places/Send/", new HttpHandler() {
public void handle(HttpExchange exchange) throws IOException {
System.out.println("Hit! /Places/Send/");
exchange.sendResponseHeaders(200, 0);
ObjectInputStream out = new ObjectInputStream(exchange.getRequestBody());
try {
Place pl = (Place)out.readObject();
GetResponces.writeFile(new File("C://Users//programmerGuy//gameServer//Places//" + pl.getName()),pl);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
out.close();
exchange.getRequestBody().close();
System.out.println(exchange.getRemoteAddress().getHostName() + " : " + exchange.getRemoteAddress().getHostString());
}
});
}
GetResponces是我为处理大多数文件IO而构建的类。我需要做的就是把这些Place对象html" target="_blank">上传到服务器上,我的问题是,我该怎么做?
编辑:我的新客户代码是:
public void sendNewPlace(Place place) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://127.0.0.1:410/Places/Send/"))
.POST(BodyPublishers.ofString(new Gson().toJson(place)))
.build();
try {
client.send(request, HttpResponse.BodyHandlers.discarding());
} catch (IOException | InterruptedException e) {
System.out.println("Error: " + e + ", please contact game admin.");
}
}
如果服务器端代码与此有关,则如下所示:
public void makePlacesRecieveContext() {
server.createContext("/Places/Send/", new HttpHandler() {
public void handle(HttpExchange exchange) throws IOException {
System.out.println("Hit! /Places/Send/");
exchange.sendResponseHeaders(200, 0);
String byteString = new String(exchange.getRequestBody().readAllBytes());
Place p = new Gson().fromJson(byteString, Place.class);
GetResponces.writeFile(new File(System.getProperty("user.home") + "/webServer/places/" + p.getName() + ".place"), p);
System.out.println(exchange.getRemoteAddress().getHostName() + " : " + exchange.getRemoteAddress().getHostString());
}
});
}
由于某种原因,我的错误保持不变...我的客户端代码是println-ing错误:java.io.IO异常:分块传输编码,状态:READING_LENGTH,请联系游戏管理员。
编辑3:完整的错误如下:(我试图使用扰流板,我希望它能工作)java.io.异常:分块传输编码,状态:READING_LENGTH在java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:565)在java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)在HttpClients. HttpPlaceClient.sendNewPlace(HttpPlaceClient.java:53)在txtGame. Modules.makeNewPlace(Modules.java:117)在txtGame. Player.(Player.java:38)在txtGame. Main.(Main.java:16)在txtGame.Main.main(Main.java:99)引起的:java.io.IO异常:分块传输编码,状态:READING_LENGTH在java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:294)在java.net.http/jdk.internal.net.http.Http1Response$BodyReader.onReadError(Http1Response.java:741)在java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver. java: 297)在java. net. http/jdk. interal. net. http. Http1AsyncReceiver. flush(Http1AsyncReceiver. java: 263)在java. net. http/jdk. interal. net. http.公共。SequentialScheduler$SynChronizedRestartableTask. run(SequentialScheduler. java: 175)在java. net. http/jdk. interal. net. http.公共。SequentialScheduler$CompleteRestartableTask. run(SequentialScheduler. java: 147)在java. net. http/jdk. interal. net. http.公共。在java. net. http/jdk. interal. net. http. Sockettube$InternalReadPublisher$ReadSubcript. signal办案(SocketTube. java: 632)在java. net. http/jdk. interal. net. http. SocketTub$InternalReadPublisher$ReadSubcript. signal办案(SocketTub. java: 632)在java. net. http/jdk. interal. net. http. SocketTub$InternalReadPublisher$InternalReadSubcript. read(SocketTub. java: 833)在java. net. http/jdk. interal. net. http.
注意!!!:如果您能帮我把这个问题缩短一些(如果有剧透的话),我们将不胜感激
首先,你必须通过
实现java。伊奥。可序列化
然后,需要将Place对象转换为json对象,这可以通过使用Jackson或GSON库轻松完成。
使用Gson的示例:
Gson gson = new Gson();
String json = gson.toJson(placeObject);
稍后,当收到响应时,您可以使用相同的库将其反序列化回Place对象。
Place placeObject = new Gson().fromJson(json, Place.class);
问题内容: 在Java中,如何编写HTTP请求消息并将其发送到HTTP WebServer? 问题答案: 你可以使用。 示例(从此处开始),进行了改进。包括在链接腐烂的情况下:
问题内容: 我有Restful Web服务,我发送POST和GET HTTP请求,以及如何使用JAVA在httpURLConection中发送PUT和DELTE请求HTTP。 问题答案: 放 删除
问题内容: 我正在尝试使用node.js将http请求发送到neo4j数据库。这是我正在使用的代码: 我检查数据库是否正在运行(我已连接到管理网页,并且一切正常。)恐怕问题不在数据库方面,而在node.js方面。 我希望有人可以对此问题有所启发。我想学习如何在node.js中发送http请求,答案不必特定于neo4j问题。 提前致谢 问题答案: 如果是简单的GET请求,则应使用 否则,需要关闭。
问题内容: 我在这里尝试做的是获取给定URL的标头,以便确定MIME类型。我希望能够查看是否http://somedomain/foo/将返回例如HTML文档或JPEG图像。因此,我需要弄清楚如何发送HEAD请求,以便无需下载内容就可以读取MIME类型。有人知道这样做的简单方法吗? 问题答案: 使用。 还有一个getheader(name)获取特定的标头。
问题内容: 我想知道是否可以将PUT,DELETE请求(实际上)发送java.net.HttpURLConnection到基于HTTP的URL。 我已经读了很多描述如何发送GET,POST,TRACE,OPTIONS请求的文章,但是我仍然没有找到成功执行PUT和DELETE请求的示例代码。 问题答案: 要执行HTTP PUT: 要执行HTTP删除:
很多时候我们需要在页面打开的时候,读取远程的内容,然后在当前页面显示. 这就需要用到 http请求了. vue页面调用http请求 vuejs 内置了对发送http请求的支持. 只需要在对应页面的script 标签内加上对应的代码就好. 例如: 我们新增一个页面,叫 "博客列表页" : src/components/BlogList.vue, 内容如下: <template> <div >