Java-关闭套接字会得到不同的结果
当另一个套接字关闭时,尝试从一个套接字读取时,我得到了不同的结果 我有两个插座A和B 1B向A发送了一些数据->A已读取数据->A关闭->当B尝试从A读取一些数据时,它将获得-1或EOF 2B向A发送了一些数据->A在读取数据之前关闭->现在B尝试从A读取数据,异常是thrownjava.net.SocketException软件导致的连接中止 如果你不明白我的问题,请原谅。请看代码 Server.javaJava-关闭套接字会得到不同的结果,java,sockets,networking,tcp,socketexception,Java,Sockets,Networking,Tcp,Socketexception,当另一个套接字关闭时,尝试从一个套接字读取时,我得到了不同的结果 我有两个插座A和B 1B向A发送了一些数据->A已读取数据->A关闭->当B尝试从A读取一些数据时,它将获得-1或EOF 2B向A发送了一些数据->A在读取数据之前关闭->现在B尝试从A读取数据,异常是thrownjava.net.SocketException软件导致的连接中止 如果你不明白我的问题,请原谅。请看代码 Server.java import java.io.*; import java.net.*; class
import java.io.*;
import java.net.*;
class SocketCloser extends Thread
{
private Socket c;
public SocketCloser(Socket c) {
this.c = c;
}
public void run() {
try{
this.c.close();
} catch (Exception e) {}
}
}
public class Server
{
public static void main(String argv[]) throws Exception {
ServerSocket listen = new ServerSocket(6789);
Socket socket = listen.accept();
SocketCloser sc = new SocketCloser(socket);
InputStream is = socket.getInputStream();
// uncomment below line to get "Software caused connection abort" on client
//sc.start();
try {
Thread.sleep(1000);
int i = is.read();
System.out.println("read returned: " + i);
socket.close();
} catch (Exception e) {
System.out.println(e.toString() + " thrown");
}
}
}
Client.java
import java.io.*;
import java.net.*;
public class Client
{
public static void main(String argv[])
{
Socket cSocket;
try {
cSocket = new Socket("localhost", 6789);
InputStream is = cSocket.getInputStream();
OutputStream os = cSocket.getOutputStream();
Thread.sleep(1000);
os.write(200);
Thread.sleep(1000);
int i = is.read();
System.out.println("read returned: " + i);
cSocket.close();
} catch (Exception e) {
System.out.println(e.toString() + " thrown");
}
}
}
有人能帮我弄清楚为什么在一种情况下出现异常,而在另一种情况下出现-1。有趣的是,在linux上,这两种情况都导致了-1。1因为B建立了连接,a将关闭\u等待。它将处于该状态,直到B关闭连接。没有要读取的内容,因此B的InputStream上的读取调用返回-1 2 A在接受呼叫中被阻止。另一个线程正在尝试关闭套接字,但它无法关闭,因为accept正在阻止它。当B连接时,接受解锁,插座完全关闭。当B尝试读取时,套接字不再存在,因此会出现异常 我简化了一点,但这就是要点 1B向A发送了一些数据->A已读取数据->A关闭->当B尝试从A读取一些数据时,它将获得-1或EOF 我同意。你期待什么?这是预期的行为 2B向A发送了一些数据->A在读取数据之前关闭->现在B尝试从A读取数据,异常是thrownjava.net.SocketException软件导致的连接中止 我同意。这是这种不正确情况下的预期行为之一。你期待什么 如果你不明白我的问题,请原谅
这里没有需要理解的问题。你一个问题也没问。您关闭一个套接字而不发送任何数据,而对等方获得EOS而不接收任何数据。当对等方发送时,您关闭一个套接字,而对等方收到一个异常。系统正在按设计工作 答案与关闭连接的不同阶段有关——在案例2中,理想情况下,当我在linux上运行程序时,应该会出现异常,但在linux上返回-1。这是我在windows JDK 1.6.023上得到的行为。但是在linux OpenJDK 1.7.0_09和SunJDK 1.6.0_20上,我在这两种情况下都收到了-1。我在不同的平台上得到了不同的结果。请你解释一下,我在哪个平台上得到了正确的行为,为什么?@RAghu Your 2的情况不正确。对于不正确的情况,没有定义正确的行为。TCP缓冲的差异可以解释您所获得的不同行为,但答案仍然是不发送对等方未读取的数据。