Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-关闭套接字会得到不同的结果_Java_Sockets_Networking_Tcp_Socketexception - Fatal编程技术网

Java-关闭套接字会得到不同的结果

Java-关闭套接字会得到不同的结果,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

当另一个套接字关闭时,尝试从一个套接字读取时,我得到了不同的结果

我有两个插座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 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缓冲的差异可以解释您所获得的不同行为,但答案仍然是不发送对等方未读取的数据。