Java 空套接字输入流

Java 空套接字输入流,java,sockets,inputstream,Java,Sockets,Inputstream,作为实践,我试图用Java构建一个简单的web服务器,但遇到了一个非常奇怪的问题。当我试图从套接字读取输入流时,有时没有要读取的数据。 我遵循的过程如下: 我创建了一个ServerSocket,监听端口80,然后调用accept()来获取一个Socket。然后我从我的浏览器(Firefox)向localhost发送请求,这会触发accept()返回套接字 有时,它会完美地读取HTTP请求。其他时候,它无法读取任何数据(read()返回-1) 下面是一些示例代码来说明我在做什么,没有抛出任何异常处

作为实践,我试图用Java构建一个简单的web服务器,但遇到了一个非常奇怪的问题。当我试图从
套接字
读取
输入流
时,有时没有要读取的数据。 我遵循的过程如下:

我创建了一个
ServerSocket
,监听端口80,然后调用
accept()
来获取一个
Socket
。然后我从我的浏览器(Firefox)向
localhost
发送请求,这会触发
accept()
返回
套接字

有时,它会完美地读取HTTP请求。其他时候,它无法读取任何数据(
read()
返回-1)

下面是一些示例代码来说明我在做什么,没有抛出任何异常处理:

ServerSocket serv = new ServerSocket(80);

while (true)
{
  Socket con = ServerSocket.accept();

  InputStream input = con.getInputStream();

  bytes[] bytes = new bytes[4000000]; // for simplicity, I figured I'd 
                                      // just make the array huge for now

  int bytesRead = input.read(bytes);
  if (bytesRead > 0)
  {
    StringBuffer sBuffer = new StringBuffer(bytesRead);

    for (int i = 0; i < bytesRead; i++)
    {
      sBuffer.append((char) bytes[i]);
    }

    System.out.println(sBuffer.toString());
  }
}
serversocketserv=newserversocket(80);
while(true)
{
Socket con=ServerSocket.accept();
InputStream输入=con.getInputStream();
bytes[]bytes=新字节[4000000];//为了简单起见,我想
//现在只需将阵列变大即可
int bytesRead=input.read(字节);
如果(字节读取>0)
{
StringBuffer sBuffer=新的StringBuffer(字节读取);
for(int i=0;i

编辑:我还尝试使用
BufferedInputStream
BufferedReader
无效。

一个套接字可以接收更多数据包。因此,您应该为每个套接字创建一个新线程。比如:

while(true){
    Socket socket = serv.accept();
    Client client = new Client(socket);
    new Thread(client).start();
}
然后需要创建实现可运行接口的客户机类

Socket socket;
public Client(Socket socket){
    this.socket = socket;
}
public void run(){
    while(socket.isConnected()){
        //here reads the packets from the inputstream
    }
}

从InputStream读取数据时,应始终循环。无法保证所有数据都将从单个
read()
调用返回(循环直到收到
-1
)。

谢谢您的提示。这并没有引起我的问题,但很高兴知道,谢谢!将套接字处理移动到单独的线程中解决了我的问题。