gpt4 book ai didi

Java:使用 TCP 套接字的简单 http GET 请求

转载 作者:可可西里 更新时间:2023-11-01 02:34:12 24 4
gpt4 key购买 nike

我在本地托管一个简单的 PHP 回显服务器。我正在尝试用 Java 向服务器发送消息,并使用 GET 请求打印响应,但收到“格式错误的 HTTP 请求”错误。谁能告诉我如何正确格式化 GET 请求?

//客户端代码:

import java.io.*;
import java.net.*;

public class TCPclient {

public static void main(String argv[]) throws Exception {
String sentence, modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("localhost", 8000);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + "\n");
outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n");


modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
inFromServer.close();
outToServer.close();
inFromUser.close();
clientSocket.close();
}

}

//PHP Server code:

<?php

/* Simple php echo page
*/

// ini_set('display_errors', 'On');
// error_reporting(E_ALL | E_STRICT);
if(isset($_GET['source'])) {
if ($_GET['source'] == "raw")
echo file_get_contents(basename($_SERVER['PHP_SELF']));
else
echo "<pre>" . htmlspecialchars(file_get_contents(basename($_SERVER['PHP_SELF']))) . "</pre>";
} else if (isset($_GET['message'])){
echo strtoupper( htmlspecialchars($_GET['message'])) . '\n';
} else {
?>
<html>
<head>
<title>Error: No input message</title>
</head>
<body>
<h1> No message</h1>
<p>Echo server called without sending parameter</p>
</body>
</html>
<?php
}
?>

最佳答案

http 服务器理解 GET、POST、PUT、DELETE 等词。所以这里有一个问题:

        outToServer.writeBytes(sentence + "\n");
outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n");

第一个语句告诉 http 服务器一些它不理解的东西:句子。注释掉该行,您的请求就会生效,您将收到回复。

我猜您想将句子作为参数发布到 echo 服务。你可以把它放在查询字符串中:

        outToServer.writeChars("GET /echo.php?message=" + sentence + " HTTP/1.0\n\n"); 

我还更改了 HTTP 版本并附加了一个额外的\n,正如 Steffen Ullrich 的评论所指出的:

Also you must add empty line to mark the end of the header. And the line ending must be \r\n not \n. And you should better do a HTTP/1.0 request not HTTP/1.1 since your code is neither able to deal with HTTP keep-alive nor with HTTP chunked encoding

然而,这还不够。您还需要对一些字符进行编码,例如空格。正如 @zapl 在评论中指出的那样,get 请求中的 URL 必须经过编码。

我还建议首先使用简单的 telnet 测试您的 echo 服务:

telnet localhost 8000

在那里,您可以输入消息“GET/echo.php?message=something”并验证它是否有效。找到按预期工作的内容后,您可以相应地更新 Java 代码。

关于Java:使用 TCP 套接字的简单 http GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com