使用Java进行网络编程

使用Java进行网络编程

问题描述:

我正在做对吗?当我尝试在我的计算机环回地址上运行此操作时,出现“连接重置”错误。使用Java进行网络编程

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

我抢端口上运行,该端口连接到服务器和主机的主要方法的参数,创建套接字和使用的BufferedReader和PrintWriter的。我非常仔细地跟踪了Oracle的教程,所以我不确定我在哪里犯了一个错误。

+0

为什么你的'PrintWriter writer'在服务器中使用不同的构造函数进行初始化,而不是客户端中使用的构造函数? – Pshemo

@EJP是正确的,但我认为实际的问题是服务器端不关闭或冲洗writer。当服务器退出时,TCP/IP连接会被关闭(由服务器端OS),而没有任何数据写入套接字。客户端JVM看到重置连接并引发异常。

解决方案:在服务器端正确关闭流,客户端应该看到数据。 (Flushing也可以......但是如果你忽略了在所有情况下都关闭流,你可能会面临服务器端文件描述符泄漏的问题,因此关闭是最好的解决方案。)

+0

客户端JVM没有看到关闭的套接字。它看到*重置连接*并引发异常。重置可能是由于对方没有关闭套接字,而是Windows重新设置它,或者重新设置它,或者三四个其他的东西。 – EJP

+0

谢谢,关闭了为我工作的插座。 – hydrozoah

+0

@EJP - 这就是我的意思... –

你只读一个字符,而不是日期。尝试发送和接收一条线。