开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from 老馬/WebJava
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
WebJava
/
Web
/
HttpServer.java
WebJava
/
Web
/
HttpServer.java
HttpServer.java 7.74 KB
一键复制 编辑 原始数据 按行查看 历史
Ma 提交于 2015年06月12日 09:41 +08:00 . 添加Demo
package Web;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 服务器 负责分配静态文件服务器和应用服务
*
* @author Ma
*/
public class HttpServer {
public static void init(int port) {
try {
//初始化数据库连接
DB.connection();
Selector selector = Selector.open();//创建selector
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(port));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);//注册
SocketChannel channel;
try {
while (true) {
selector.select();
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
Object attach = key.attachment();
//如果有正在读取静态文件的标记就返回
if (attach != null && attach.equals(0)) {
continue;
}
//开始处理
if (key.isAcceptable()) { // 接收请求
ServerSocketChannel server = (ServerSocketChannel) key.channel();
channel = server.accept();
//设置非阻塞模式
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) { // 读信息
channel = (SocketChannel) key.channel();
ByteBuffer clientBuffer = ByteBuffer.allocate(1024);
int count = channel.read(clientBuffer);
String receive = "";
while (count > 0) {
clientBuffer.flip();
CharBuffer charBuffer = Charset.forName("UTF-8").decode(clientBuffer);
String temp = charBuffer.toString();
receive = receive + temp;
clientBuffer.clear();
count = channel.read(clientBuffer);
channel.register(selector, SelectionKey.OP_WRITE);
}
key.attach(receive);
clientBuffer.clear();
} else if (key.isWritable()) { // 写事件
//开始处理事件
//开始时间
long startTime = System.currentTimeMillis();
channel = (SocketChannel) key.channel();
boolean accessStaticFile = false;//是不是访问的静态文件
// 写事件
Request request = new Request((String) key.attachment());
if (request.Path.equals("/favicon.ico") || request.Path.equals("robots.txt") || request.Path.toLowerCase().indexOf("/static") == 0) {
//##处理
//#说明是访问静态文件
accessStaticFile = true;
StaticFileServer staticFile = new StaticFileServer(request);
if (staticFile.exists()) {
staticFile.read(channel);
key.attach(0);//这个标记是正在读取静态文件
continue;//读取下一个循环
} else {
//如果不存在
//当作非静态文件处理404 省事
accessStaticFile = false;
Response.setStatus(404);
}
}
//访问的不是静态文件,或者静态文件不存在
if (!accessStaticFile) {
//###处理请求
//获取客户端IP
request.setRemoteIP(channel.socket().getLocalAddress().getHostName());
//开始分配到Handler
Allocation.init(request);
//Handler结束
if (Response.Content == null) {
Response.setContent("未知错误造成,无返回实体!");
Response.setStatus(500);
}
byte[] contentBytes = Response.Content.getBytes("UTF-8");
//先设置实体长度
Response.setContentLength(contentBytes.length);
//然后获取header
byte[] headerBytes = Response.getHeader().getBytes("UTF-8");
ByteBuffer writerBuffer = ByteBuffer.allocate(headerBytes.length + contentBytes.length);
writerBuffer.clear();
writerBuffer.put(headerBytes);
writerBuffer.put(contentBytes);
writerBuffer.flip();
while (writerBuffer.hasRemaining()) {
channel.write(writerBuffer);
}
writerBuffer.clear();
channel.close();
//输出debug信息
if (Options.DEBUG || Options.ParseLine) {
System.out.println(Response.Status + " " + request.Header.get("Host") + request.Path + " " + (System.currentTimeMillis() - startTime) + "ms");
}
//完成响应,清理相应信息
Response.finish();
}
}
}
}
} finally {
serverChannel.close();
}
} catch (IOException ex) {
Logger.getLogger(HttpServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* 设置URL
*
* @param path
* @param handler
*/
public static void setPATH(String path, Object handler) {
Allocation.PATH.put(path, handler);
}
/**
* 获取所有的Path
*
* @return
*/
public static String[] getAllPath() {
String[] pathArray = new String[Allocation.PATH.size()];
Set set = Allocation.PATH.entrySet();
Iterator iterator = set.iterator();
int i = 0;
while (iterator.hasNext()) {
java.util.Map.Entry item = (java.util.Map.Entry) iterator.next();
pathArray[i] = (String) item.getKey();
i++;
}
return pathArray;
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

Web.Java是一个高性能的Java服务器。
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/jsmth/WebJava.git
git@gitee.com:jsmth/WebJava.git
jsmth
WebJava
WebJava
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /