3

我正在尝试在 Java 中构建一个简单的 Web 服务器作为练习,但我遇到了一个非常奇怪的问题。当我尝试从中读取时InputStreamSocket有时没有要读取的数据。我正在遵循的过程是这样的:

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

有时,它会完美地读取 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());
  }
}

编辑:我也试过使用 aBufferedInputStreamBufferedReader没有用。

4

2 回答 2

3

从 InputStream 读取数据时,您应该始终循环。不能保证所有数据都将从一次read()调用中返回(循环直到您收到-1)。

于 2012-09-24T19:21:40.013 回答
3

一个套接字可以接收更多的数据包。所以你应该为每个套接字创建一个新线程。就像是:

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
    }
}
于 2012-09-24T19:18:27.877 回答