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
Java套接字不';不要等待接收字节_Java_Sockets - Fatal编程技术网

Java套接字不';不要等待接收字节

Java套接字不';不要等待接收字节,java,sockets,Java,Sockets,我用java开发了一个套接字,如下所示: serverSocket = new ServerSocket(port); System.out.println("Listening in port " + port + " ..."); while (true) { socket = serverSocket.accept(); System.out.println("Connection has been created."); handle(socket); }

我用java开发了一个套接字,如下所示:

serverSocket = new ServerSocket(port);

System.out.println("Listening in port " + port + " ...");

while (true) {
    socket = serverSocket.accept();
    System.out.println("Connection has been created.");
    handle(socket);
}
class MyClass {

    private Socket socket;
    private InputStream is;
    private PrintWriter out;
    private OutputStream ds;

    public MyClass(Socket socket, InputStream is) {
        this.socket = socket;
        this.is = is;
        initializeOutputStream(socket);
    }

    private void initializeOutputStream(Socket socket) {
        try {
            ds = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {

        while (true) {
            try {

                int dataLength = 10;
                byte[] dataBuffer = new byte[dataLength];
                is.read(dataBuffer, 0, dataLength);
                // Read and Print cmd.
                System.out.println("data:" + DataLayer.byteToString(dataBuffer));

            } catch (IOException e) {
                e.printStackTrace();
                try {
                    ds.close();
                    System.out.println("ds closed.");
                    is.close();
                    System.out.println("is closed.");
                    socket.close();
                    System.out.println("socket closed.");
                    break;
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
        }
    }
}
句柄
方法是:

private static void handle(final Socket socket) throws IOException {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                InputStream is = socket.getInputStream();
                MyClass elevator = new MyClass(socket, is);
                elevator.start();
            } catch (IOException io) {
                io.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
MyClass是这样的:

serverSocket = new ServerSocket(port);

System.out.println("Listening in port " + port + " ...");

while (true) {
    socket = serverSocket.accept();
    System.out.println("Connection has been created.");
    handle(socket);
}
class MyClass {

    private Socket socket;
    private InputStream is;
    private PrintWriter out;
    private OutputStream ds;

    public MyClass(Socket socket, InputStream is) {
        this.socket = socket;
        this.is = is;
        initializeOutputStream(socket);
    }

    private void initializeOutputStream(Socket socket) {
        try {
            ds = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {

        while (true) {
            try {

                int dataLength = 10;
                byte[] dataBuffer = new byte[dataLength];
                is.read(dataBuffer, 0, dataLength);
                // Read and Print cmd.
                System.out.println("data:" + DataLayer.byteToString(dataBuffer));

            } catch (IOException e) {
                e.printStackTrace();
                try {
                    ds.close();
                    System.out.println("ds closed.");
                    is.close();
                    System.out.println("is closed.");
                    socket.close();
                    System.out.println("socket closed.");
                    break;
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
        }
    }
}
当客户端发送数据时,它工作正常,但当客户端不发送数据时,它会打印:

data:0

data:0

data:0
...
它不会停止


您能告诉我如何解决这个问题吗?

您描述的情况发生在客户端关闭连接时(即,套接字在最后关闭/流),而不是在客户端不发送任何内容时(如果客户端空闲但仍然连接,服务器不打印任何内容)

这是因为
InputStream
类的
read
方法在流/连接关闭时不会抛出异常,而只是返回值
-1
,因此在您的实现中,while循环继续无限运行

因此,此问题的快速解决方法是将读取流的行替换为以下两行:

int endOfStream=is.read(dataBuffer, 0, dataLength);
if(endOfStream==-1) break;
基本上,通过这种方式,您可以检查流是否已关闭:如果是这种情况,请中断while循环

另一个解决方案是声明并初始化变量
intendofstream=0在while循环之前,并通过以下方式更改while循环条件:

int endOfStream = 0; //init to 0 to enter a first time in the loop
while (endOfStream != -1) { //new loop condition
    try {
        int dataLength = 10;
        byte[] dataBuffer = new byte[dataLength];
        endOfStream = is.read(dataBuffer, 0, dataLength); //store the return of read
        if (endOfStream != -1) { //check if we are not at the end of the stream
            // Read and Print cmd.
            System.out.println("data:" + dataBuffer[0]);
        }
//... the rest of your code ...
代码中的另一个问题是我猜是一个bug,但我不确定,因为否则您将无法运行代码(但我不能说,因为您复制的代码不完整)。错误是在调用start方法
MyClass.start()时出现的:由于此方法不是静态的,因此必须在您之前实例化该行的类
MyClass
的对象上调用它,即以以下方式调用此方法:
lifter.start()


我希望这能对您有所帮助。

什么是
。read
返回?“endOfStream”是一个奇怪的变量名称,它包含读取计数或流结束指示符值。它不是布尔值。Thnx Enne,对不起,实际上它是电梯。开始();如果(is.read(dataBuffer,0,dataLength)=-1)中断,我尝试编写代码;现在我来检查它是否工作正常。@EJP您是对的,但这只是为了让OP超级清晰
int something = is.read(dataBuffer, 0, dataLength);
if(something ==-1)
  break; 
else
  System.out.println("data:" + DataLayer.byteToString(dataBuffer));