用Java进行网络编程
我这样做对吗?当我尝试在我的计算机上运行这个环回地址时,我得到一个“连接重置”错误用Java进行网络编程,java,Java,我这样做对吗?当我尝试在我的计算机上运行这个环回地址时,我得到一个“连接重置”错误 我在main方法中获取要运行服务器的端口、要连接的端口和作为参数的主机,创建套接字并使用BufferedReader和PrintWriter。我非常仔细地阅读了Oracle的教程,所以我不确定我在哪里会犯错误。您只阅读了一个字符,而不是日期。尝试发送和接收一行。您只读取一个字符,而不是日期。尝试发送和接收一行。@EJP是正确的,但我认为实际问题是服务器端既没有关闭也没有刷新writer。当服务器退出时,TCP/I
我在main方法中获取要运行服务器的端口、要连接的端口和作为参数的主机,创建套接字并使用BufferedReader和PrintWriter。我非常仔细地阅读了Oracle的教程,所以我不确定我在哪里会犯错误。您只阅读了一个字符,而不是日期。尝试发送和接收一行。您只读取一个字符,而不是日期。尝试发送和接收一行。@EJP是正确的,但我认为实际问题是服务器端既没有关闭也没有刷新
writer
。当服务器退出时,TCP/IP连接(由服务器端操作系统)关闭,而没有任何数据写入套接字。客户端JVM看到重置连接并抛出异常
解决方案:在服务器端正确关闭流,客户端应该可以看到数据。(刷新也可以……但是如果您在所有情况下都忽略关闭流,则可能会出现服务器端文件描述符泄漏的问题。因此,关闭是最佳解决方案。)@EJP是正确的,但我认为实际问题是服务器端既没有关闭也没有刷新
writer
。当服务器退出时,TCP/IP连接(由服务器端操作系统)关闭,而没有任何数据写入套接字。客户端JVM看到重置连接并抛出异常
解决方案:在服务器端正确关闭流,客户端应该可以看到数据。(刷新也会起作用……但如果在所有情况下都忽略关闭流,则可能会出现服务器端文件描述符泄漏的问题。因此,关闭是最好的解决方案。)为什么您的
PrintWriter
在服务器中使用的构造函数与在客户端使用的构造函数不同?为什么您的PrintWriter
在服务器中使用的构造函数与在客户端使用的构造函数不同?客户端JVM看不到闭合的套接字。它看到重置连接并引发异常。重置的原因可能是对等方没有关闭套接字,而Windows善意地将其重置,或者是其他三四个原因。客户端JVM没有看到关闭的套接字。它看到重置连接并引发异常。重置的原因可能是对等方没有关闭套接字,Windows善意地将其重置,或者是其他三、四件事情。
public class DateTimeClient {
public static void main(String[] args) throws IOException {
int port = Integer.parseInt(args[0]);
String host = args[1];
try {
System.out.println("Connecting....\n");
Socket socket = new Socket(host, port);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println("Date: " + reader.read());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class DateTimeServer {
public static void main(String[] args) {
int portNum = Integer.parseInt(args[0]);
try {
ServerSocket socket = new ServerSocket(portNum);
Socket client = socket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(
client.getInputStream()));
PrintWriter writer = new PrintWriter(client.getOutputStream());
Date date = new Date();
writer.print(date.toString());
} catch(Exception e) {
e.printStackTrace();
}
}
}