作为练习,我正在尝试用 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());
}
}
编辑:我也尝试过使用 BufferedInputStream
和 BufferedReader
但没有用。
最佳答案
一个套接字可以接收更多的数据包。所以你应该为每个套接字创建一个新线程。像这样的东西:
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/