用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();
    }
}
}