繁体   English   中英

使用Java中的套接字向服务器发送请求

[英]sending request to server using socket in java

我正在使用套接字与服务器建立流连接。 通过创建套接字,我尝试使用套接字向服务器发送请求。 但是无论我使用哪种方法,服务器都不会收到请求。 这些是我用来发送请求的方法。

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(query);

或另一个是

 out = new ObjectOutputStream(connection.getOutputStream());
 out.writeObject(msg);
 out.flush();

我尝试发送的请求是这样的:

String query = String.format("cmd=%s&version=%s", "handshake", "1.0");

我知道使用Httpconnection发送此查询要容易得多,但这是必须完成的方法。 所以请帮我 这是httpconnection命令

 String charset = "UTF-8";
 String query = String.format("cmd=%s&version=%s", "handshake", "1.0");
 String charset = "UTF-8";
 URL url = new URL("serveraddress:8080");           
 URLConnection conn = url.openConnection();         
 conn.setDoOutput(true);            
 conn.connect();            
 OutputStream output = conn.getOutputStream();              
 output.write(command.getBytes(charset));                                       

 InputStreamReader content = new InputStreamReader(conn.getInputStream());                              
 String result ="";
 int c = content.read();
 while (c != -1) {
    result = result + ((char) c);  
        c = content.read();
} 
 Log.v(logTag, "Received: [" + result + "]");

这是我在插座上做的没用的

 URL url = new URL("serveraddress:8080");               
 String server_name = url.getHost();
 int port = url.getPort();
 Socket socket = new Socket(server_name, port);                         

 String query = "post /swarm HTTP/1.1\nHost: serveraddress\n" +
 "content-length: 27\nkeep-alive: 300\nconnection: keep-alive\n\n" +
 "cmd=handshake&version=1.0\n"; 

 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
 out.println(query);

根据服务器日志,套接字连接在没有任何请求的情况下打开和关闭

您提到的三种方法(PrintWriter,ObjectOutputStream和HTTPConnection)都会导致将某些内容发送到服务器,但是实际发送的内容在各种方法之间将有很大的不同。

首先,Java ObjectOutputStream类将对您写入其的对象进行编码 ,并提供有关这些对象所属的类的信息,尤其是类名,签名等。这实际上仅在与另一个Java应用程序通信时才适用在另一端使用ObjectInputStream读取它。 它尤其不会遵循HTTP协议,因此,您很可能根本无法使用HTTPConnection来使用它。

使用HttpURLConnection实际上将构造完整的(最重要的是有效的)HTTP请求并将其发送到您尝试连接的服务器。 例如,如果您要执行以下代码:

URL url = new URL("http://localhost/test?cmd=handshake&version=1.0");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();

然后结果将是您的应用程序连接到localhost:80并编写如下内容:(这是一个简化的请求。实际请求中将包含其他标头和信息。)

GET /test?cmd=handshake&version=1.0 HTTP/1.1
Host: localhost

最后,如果您使用的是PrintWriter ,则实际上会将纯文本发送到服务器。 但是,如果服务器是HTTP服务器(可能是因为您说它响应HTTP连接),则仅发送请求的命令部分是不够的。 您还必须发送其余部分,包括GET ,HTTP版本,可能的一些标头,尾随的空行和CRLF行的结尾。 所有这些都可以使用PrintWriter完成。

安装诸如Wireshark之​​类的网络数据包分析器并使用它来实际查看在使用httpconnection执行连接时发送到服务器的内容,然后尝试通过手动构造请求来模仿它是一个好主意。

我还建议您阅读有关HTTP协议的更多详细信息。 一个很好的起点可以是Wikipedia文章

根据OP中的新信息进行编辑:

更新的代码中存在一些小的不一致之处,我可以认为其中一些是复制粘贴错误,而我想指出的是一些以防万一。

基于URLConnection的解决方案没有在任何地方指定“ / swarm”资源。 添加该内容不会更改请求是否实际发送,也不会更改请求的有效性,但这可能会影响您是否可以在日志中找到该请求。

除了使用小写字母编写POST之外,查询字符串总体上看起来是合理的。 最初我并不认为这会有所作为,但是当尝试通过Telnet针对www.google.com进行“获取”与“获取”时,似乎没有什么不同。 如果Web服务器无法将该请求识别为请求,则它将无法处理该请求,因此它可能不会如您期望的那样显示在日志中。

我建议您实际阅读服务器响应并将其打印到System.out,以便查看服务器是否报告任何特定错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM