我正在尝试编写一个简单的Java
http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“
www.google.com”)后挂起:
import java.io.*;
import java.net.*;
public class DNSTest {
// Constructor
public DNSTest() { }
// Builds GET request, opens socket, waits for response, closes
public static void main(String[] args) throws Exception{
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//For each hostname
while ((line = br.readLine()) != null){
//Resolve the hostname to an IP address
InetAddress ip = InetAddress.getByName(line);
//Open socket on ip address
Socket socket = new Socket(ip, 80);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Send request
out.println("GET /index.html HTTP/1.0\n");
//Read one line of input
System.out.println("Response from "+line+": "+in.readLine());
}
}
}
有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。
我认为我可以通过对代码进行少量更改来重现该问题,因此现在它在我的计算机上不起作用,并且表现出与您的环境相同的行为。我只是将out.println
调用更改为更简单的命令out.print
,瞧瞧,该程序
在 发出请求之后但 在 最后一次println
调用 之前 挂起。
据我所记得,HTTP请求需要在标头后面提供一个空行,其中行分隔符必须是\r\n
几个字符。我想您的环境println
不会发送正确的行分隔符(您可以检查的值System.getProperty("line.separator")
以验证哪些是系统上使用的分隔符),因此服务器将请求解释为不完整,并且在输入端。一些服务器相当宽容,只接受\n
行分隔符,但是如果您碰巧\n
显式地和\r\n
隐式地发送(通过println
),则您假定的空行包含该\r
字符并且不再被视为空行,可能会导致请求的结果错误阻止服务器发回任何响应。
因此,我的建议是print
显式使用并发送正确的行分隔符。另外,您很可能需要添加对的调用flush
,可能是因为输出之间存在空行-
我不是很清楚,但是如果不调用flush
我的程序仍然会挂起。因此,总而言之,以下应该起作用:
// send request
out.print("GET /index.html HTTP/1.0\r\n\r\n");
out.flush();
// read one line of input
System.out.println("Response from " + line + ": " + in.readLine());
至少,通过这些更改,我也可以确认程序可以在我的机器上正常工作。
我有一个react本机应用程序,它使用与。NET Core2.1通信的signalR。 套接字连接没有任何错误。一切都很好。但是服务器不能响应客户端的ping消息,并返回504给客户端。当返回504时,客户端的连接关闭。在hubconnection.onclose()处理。然后客户端需要重新连接。 proxy_read_timeout可以设置为高毫秒。但很乱。 所以我不能在客户机上有效地使用kee
我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se
问题内容: 我做一个简单的, 没有线程 客户端 - 服务器 进行GUI有两个一个按钮程序 服务器 和 客户 端。当 客户端 按下按钮时,它将按钮上的文本更改为 “ C” 并发送到 服务器 “ C” 字符串,因此 服务器 端的按钮将文本更改为 “ C” 。 服务器的 工作方式与 客户端 相似,但是发送的是 “ S” 而不是 “ C” 。他们轮流工作:轮到 客户时 , 服务器 客户端 始终首先启动。
请你给我举一个localhost的客户端和服务器使用java nio通信的小例子?我需要了解它是如何工作的。例如1)客户端需要连接,客户端连接客户端发送“你好,我是客户端”。2)服务器接受,服务器接收来自客户端的消息,服务器响应“你好,我是服务器”3)客户端发送“你好,服务器”4)服务器发送“你好,客户端”。 我不需要服务器一次处理多个客户端,我需要了解的是客户端和服务器之间具有多个消息的连接是如
问题内容: 我正在使用apache http客户端来测试我的WS。我已经在球衣上写了一个WS。该WS的URL是 用URL调用这个WS我写了一个方法如下 现在,当我运行程序并将URL传递给此函数时,我在行中得到了异常 异常如下 现在,如果我使用WS网址并使用任何浏览器访问它,我都会得到预期的结果,但我想知道我的Apache HTTP客户端代码出了什么问题。 问题答案: 我从这里浏览了链接,并得到以下
我有一个Android Studio应用程序,用于客户端读取加速计的数据,并将其发送到运行TCP C套接字服务器的计算机。 我想等到服务器确认接收到数据后再发送一个。当我不得不从Android系统读取服务器的确认信息时,问题就出现了,这只是简单的崩溃,我不知道为什么。这是我使用的代码。 服务器代码 和客户端代码(Android Studio) 我在交流中遗漏了什么还是我做错了什么?