java - 空套接字输入流

标签 java sockets inputstream

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

我创建了一个 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());
  }
}

编辑:我也尝试过使用 BufferedInputStreamBufferedReader 但没有用。

最佳答案

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

while(true){
    Socket socket = serv.accept();
    Client client = new Client(socket);
    new Thread(client).start();
}

然后您需要创建实现可运行接口(interface)的Client类。

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

关于java - 空套接字输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571233/

相关文章:

java - 如何检查 InputStream 是否已压缩?

java - 无法将对象添加到 ArrayList 中

Java - 通过套接字传输时可序列化图像为黑色

java - 如何将 Java OutputStream 上传到 AWS S3

java - 如何更改 Java ROME 解析器默认套接字超时?

java - 我收到 java.lang.ClassCastException 但我发送的是对象,而不是字符串

java - 输入不应超过 xxx KB

java - JPA ManyToOne/OneToMany 没有在 child 身上插入值(value)

Java整数索引到位位置

java - Sortbyname 无法解析为 java 中的类型