使用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的教程,所以我不确定我在哪里犯了一个错误。
答
@EJP是正确的,但我认为实际的问题是服务器端不关闭或冲洗writer
。当服务器退出时,TCP/IP连接会被关闭(由服务器端OS),而没有任何数据写入套接字。客户端JVM看到重置连接并引发异常。
解决方案:在服务器端正确关闭流,客户端应该看到数据。 (Flushing也可以......但是如果你忽略了在所有情况下都关闭流,你可能会面临服务器端文件描述符泄漏的问题,因此关闭是最好的解决方案。)
答
你只读一个字符,而不是日期。尝试发送和接收一条线。
为什么你的'PrintWriter writer'在服务器中使用不同的构造函数进行初始化,而不是客户端中使用的构造函数? – Pshemo