在一个类中,我有一个
以下是
以下是客户端程序与Echo服务器进行通信的方式。
正如您所注意到的,客户端在连接后被确认后,我关闭了读/写流,并从为客户端提供服务的新线程中重新打开了流。然后从服务器开始读取/写入连接的套接字,但是当我尝试读取客户端发送的“Hello!”时,它会崩溃并显示EOFException,而不是得到“success”。
我知道EOF发生的原因,但不知道为什么会在这里发生,因为我没有尝试读取没有数据流的套接字(服务器应该已经写入了“success”)。
客户端在服务器打印“Hello!”并将“success”作为响应写入之前尝试读取套接字是否为时机过早?
附言:我知道通过放置大量代码来提问不是一个好方法,在这里我们期望获得问题的答案并理解它,而不是让别人帮我们解决问题并离开。所以,我提供了这么多代码来展示问题的所有方面。
ServerSocket
监听传入的连接,以下是代码:while(isRunning)
{
try
{
Socket s = mysocketserver.accept();
acknowledgeClient(s);
new ClientHandler(s).start(); //Start new thread to serve the client, and get back to accept new connections.
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
以下是
acknowledgeClient(Socket s)
代码。ObjectInputStream in = new ObjectInputStream(s.getInputStream);
ObjectOutputStream out = new ObjectOutputStream(s.getOutStream);
String msg = in.readObject().toString();
System.out.println(msg+" is Connected"); //Show who's connected
out.writeObject("success"); //Respond with success.
in.close();
out.close();
ClientHandler
的run()
方法。try
{
in = new ObjectInputStream(client.getInputStream());
out = new ObjectOutputstream(client.getOutputStream());
String msg = "";
while(!msg.equalsIgnoreCase("bye"))
{
msg = in.readObject().toString();
System.out.println("Client Says - "+msg);
out.writeObject("success");
}
in.close();
out.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
以下是客户端程序与Echo服务器进行通信的方式。
try
{
int count = 10;
client = new Socket("localhost",8666);
in = new ObjectInputStream(client.getInputStream());
out = new ObjectOutputstream(client.getOutputStream());
out.writeObject("Foo");
System.out.println("Connection Status : "+in.readObject().toString());
while(count>0)
{
out.writeObject("Hello!");
String resp = in.readObject().toString(); //Getting EOFException here.
System.out.println("Sent with :"+resp);
count--;
Thread.sleep(1000);
}
out.close();
in.close();
client.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
正如您所注意到的,客户端在连接后被确认后,我关闭了读/写流,并从为客户端提供服务的新线程中重新打开了流。然后从服务器开始读取/写入连接的套接字,但是当我尝试读取客户端发送的“Hello!”时,它会崩溃并显示EOFException,而不是得到“success”。
我知道EOF发生的原因,但不知道为什么会在这里发生,因为我没有尝试读取没有数据流的套接字(服务器应该已经写入了“success”)。
客户端在服务器打印“Hello!”并将“success”作为响应写入之前尝试读取套接字是否为时机过早?
附言:我知道通过放置大量代码来提问不是一个好方法,在这里我们期望获得问题的答案并理解它,而不是让别人帮我们解决问题并离开。所以,我提供了这么多代码来展示问题的所有方面。
close()
,就可以重新打开 Socket,但我不知道它甚至适用于 Socket 的流。 - Kushal