Java Socket没有等待接收字节

时间:2014-06-26 12:10:16

标签: 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);
}

handle方法是:

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就像这样:

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
...

并且它不会停止。

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

2 个答案:

答案 0 :(得分:1)

您所描述的情况发生在客户端关闭连接时(即最后的socket关闭/流),而时,只是客户端没有发送任何内容(如果是客户端)闲置但仍然连接,服务器不打印任何东西。)

这是因为{/ 1}}类的方法read在关闭流/连接时会抛出异常,而只返回值{{1所以在你的实现中,while循环只是继续无限运行。

因此,快速解决此问题的方法可以是用这两个来替换您读取流的行:

InputStream

基本上以这种方式检查流是否已关闭:如果是这种情况,请打破while循环。

另一个解决方案可能是在while循环之前声明并初始化变量-1,并以这种方式更改while循环条件:

int endOfStream=is.read(dataBuffer, 0, dataLength);
if(endOfStream==-1) break;

您的代码中的另一个问题是我认为是一个错误,但我不确定,否则您不能运行您的代码(但我不能说,因为您复制的代码不完整)。该错误是在您调用start方法int endOfStream=0;时:由于此方法不是静态的,您必须在之前实例化该行的类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 ... 的对象上调用它,即调用此方法方式:MyClass.start();

我希望这对你有所帮助。

答案 1 :(得分:0)

int something = is.read(dataBuffer, 0, dataLength);
if(something ==-1)
  break; 
else
  System.out.println("data:" + DataLayer.byteToString(dataBuffer));