ServerSocket在循环中不接收任何数据

时间:2016-04-29 07:53:23

标签: java serversocket

我使用ServerSocket在while循环中从客户端获取数据,它在第一次运行时工作,但在第二轮后失败。

我做了一些搜索,但仍然无法弄清楚发生了什么。

服务器端代码

package com.gorilla.main;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {

    public static void main(String[] args) throws Exception {

        ServerSocket serverSocket = new ServerSocket(44444);

        while(true){

        System.out.println("another round");

        Socket socket  = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();

        System.out.println("available: "+ inputStream.available());

        byte[] b = new byte[inputStream.available()];

        inputStream.read(b);

        System.out.println(new String(b));
        System.out.println("=======================");

        socket.close();
        }
    }
}

Clent side code

package com.gorilla.main;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client2 {

    public static void main(String [] args) throws Exception{

        Socket socket = new Socket("127.0.0.1", 44444);
        String s = "Hello World";
        byte [] b = s.getBytes();
        socket.getOutputStream().write(b);;
        socket.close();

    }
}
在我运行客户端3次后,

和服务器端控制台的输出。

another round
available: 11
Hello World
=======================
another round
available: 0

=======================
another round
available: 0

=======================
another round

任何建议都将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

使用InputStream.available()来调整缓冲区的大小,而不是从套接字中读取的内容。你应该分配一个缓冲区(通常是静态大小,或者可以是可配置的)并在循环中读取

// server code
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) > -1) {
  // do something
}

InputStream.available():

的Javadoc
  

返回可读取的字节数的估计值(或   从此输入流中跳过)而不会被下一个阻塞   调用此输入流的方法。下一次调用   可能是同一个线程或另一个线程。单个读取或跳过   这么多字节不会阻塞,但可以读取或跳过更少的字节。

如果您的协议是基于文本的,则可以将套接字的输入流包含在Scanner内,从而使循环变为

while (scanner.hasNextLine()) {
  String line = scanner.next();
}