我正在尝试创建一个接受请求的简单服务器,然后将文件内容写入发送请求的浏览器。服务器连接并写入套接字。但是我的浏览器说
未收到任何数据
并且不显示任何内容。
public class Main {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
while(true){
ServerSocket serverSock = new ServerSocket(6789);
Socket sock = serverSock.accept();
System.out.println("connected");
InputStream sis = sock.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(sis));
String request = br.readLine(); // Now you get GET index.html HTTP/1.1`
String[] requestParam = request.split(" ");
String path = requestParam[1];
System.out.println(path);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
File file = new File(path);
BufferedReader bfr = null;
String s = "Hi";
if (!file.exists() || !file.isFile()) {
System.out.println("writing not found...");
out.write("HTTP/1.0 200 OK\r\n");
out.write(new Date() + "\r\n");
out.write("Content-Type: text/html");
out.write("Content length: " + s.length() + "\r\n");
out.write(s);
}else{
FileReader fr = new FileReader(file);
bfr = new BufferedReader(fr);
String line;
while ((line = bfr.readLine()) != null) {
out.write(line);
}
}
if(bfr != null){
bfr.close();
}
br.close();
out.close();
serverSock.close();
}
}
}
答案 0 :(得分:0)
如果我使用
,您的代码适合我(数据显示在浏览器中)http://localhost:6789/etc/hosts
并且有一个文件/etc/hosts
(Linux文件系统表示法)。
如果该文件不存在,则此代码段
out.write("HTTP/1.0 200 OK\r\n");
out.write(new Date() + "\r\n");
out.write("Content-Type: text/html\r\n");
out.write("\r\n");
out.write("File " + file + " not found\r\n");
out.flush();
将返回显示在浏览器中的数据:请注意,我已在此处明确添加了对flush()
的调用。确保在其他情况下也刷新out
。
另一种可能性是重新排序close
语句。
引用EJP对How to close a socket的回答:
您应该关闭从套接字创建的最外面的输出流。那将冲洗它。
如果最外面的输出流是(来自同一来源的另一个引用),则尤其如此:
缓冲输出流,或包裹在其中的流。如果你不关闭它,它将不会被冲洗。
因此out.close()
之前应调用br.close()
。