Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Walter.Wen
HttpServer
提交
d02dafb3
H
HttpServer
项目概览
Walter.Wen
/
HttpServer
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
HttpServer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d02dafb3
编写于
6月 12, 2019
作者:
W
WalterWen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
httpserver
上级
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
166 addition
and
0 deletion
+166
-0
.classpath
.classpath
+6
-0
.gitignore
.gitignore
+1
-0
.project
.project
+17
-0
.settings/org.eclipse.jdt.core.prefs
.settings/org.eclipse.jdt.core.prefs
+11
-0
src/com/we/HttpServer.java
src/com/we/HttpServer.java
+131
-0
未找到文件。
.classpath
0 → 100644
浏览文件 @
d02dafb3
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry
kind=
"con"
path=
"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"
/>
<classpathentry
kind=
"src"
path=
"src"
/>
<classpathentry
kind=
"output"
path=
"bin"
/>
</classpath>
.gitignore
0 → 100644
浏览文件 @
d02dafb3
/bin/
.project
0 → 100644
浏览文件 @
d02dafb3
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>
HttpServer
</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>
org.eclipse.jdt.core.javabuilder
</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>
org.eclipse.jdt.core.javanature
</nature>
</natures>
</projectDescription>
.settings/org.eclipse.jdt.core.prefs
0 → 100644
浏览文件 @
d02dafb3
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8
src/com/we/HttpServer.java
0 → 100644
浏览文件 @
d02dafb3
package
com.we
;
import
java.io.IOException
;
import
java.net.InetSocketAddress
;
import
java.nio.ByteBuffer
;
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
;
public
class
HttpServer
{
public
static
void
main
(
String
[]
args
)
throws
IOException
{
// 创建 ServerSocketChanne1,监听8080端口
ServerSocketChannel
ssc
=
ServerSocketChannel
.
open
();
ssc
.
socket
().
bind
(
new
InetSocketAddress
(
8080
));
// 设置为非阻塞模式
ssc
.
configureBlocking
(
false
);
// 为ssc注册选择器
Selector
selector
=
Selector
.
open
();
ssc
.
register
(
selector
,
SelectionKey
.
OP_ACCEPT
);
// 创建处理器
while
(
true
)
{
// 等待请求,每次等待阻塞3s,超过3s后线程继续向下运行,如果传入0或者不传参数将直阻塞
if
(
selector
.
select
(
3000
)
==
0
)
{
continue
;
}
// 获取待处理的 SelectionKey
Iterator
<
SelectionKey
>
keyIter
=
selector
.
selectedKeys
().
iterator
();
while
(
keyIter
.
hasNext
())
{
SelectionKey
key
=
keyIter
.
next
();
// 启动新线程处理SelectionKey
new
Thread
(
new
HttpHandler
(
key
)).
run
();
// 处理完后, 从待处理的SelectionKey迭代器中移除当前所使用的key
keyIter
.
remove
();
}
}
}
private
static
class
HttpHandler
implements
Runnable
{
private
int
bufferSize
=
1024
;
private
String
localCharest
=
"UTF-8"
;
private
SelectionKey
key
;
public
HttpHandler
(
SelectionKey
key
)
{
this
.
key
=
key
;
}
public
void
handleAccept
()
throws
IOException
{
SocketChannel
clientChannel
=
((
ServerSocketChannel
)
key
.
channel
()).
accept
();
clientChannel
.
configureBlocking
(
false
);
clientChannel
.
register
(
key
.
selector
(),
SelectionKey
.
OP_READ
,
ByteBuffer
.
allocate
(
bufferSize
));
}
public
void
handleRead
()
throws
IOException
{
// 获取channel
SocketChannel
sc
=
(
SocketChannel
)
key
.
channel
();
// 获取buffer并重置
ByteBuffer
buffer
=
(
ByteBuffer
)
key
.
attachment
();
buffer
.
clear
();
// 没有读到内容则关闭
if
(
sc
.
read
(
buffer
)
==
-
1
)
{
sc
.
close
();
}
else
{
// 接收请求数据
buffer
.
flip
();
String
receivedString
=
Charset
.
forName
(
localCharest
).
newDecoder
().
decode
(
buffer
).
toString
();
// 控制台打印请求报文头
String
[]
requestMessage
=
receivedString
.
split
(
"\r\n"
);
for
(
String
s
:
requestMessage
)
{
System
.
out
.
println
(
s
);
// 遇到空行说明报文头已经打完
if
(
s
.
isEmpty
())
{
break
;
}
}
// 控制台打印首行信息
String
[]
firstLine
=
requestMessage
[
0
].
split
(
" "
);
System
.
out
.
println
();
System
.
out
.
println
(
"Method:\t"
+
firstLine
[
0
]);
System
.
out
.
println
(
"url:\t"
+
firstLine
[
1
]);
System
.
out
.
println
(
"HTTP Version:\t"
+
firstLine
[
2
]);
System
.
out
.
println
();
// 返回客户端
StringBuilder
sendString
=
new
StringBuilder
();
sendString
.
append
(
"HTTP/1.1 200 OK\r\n"
);
// 响应报文首行,200表示处理成功
sendString
.
append
(
"Content-Type:text/html;charset="
+
localCharest
+
"\r\n"
);
sendString
.
append
(
"\r\n"
);
// 报文头结束后加一个空行
sendString
.
append
(
"<html><head><title>显示报文</title></head></body>"
);
sendString
.
append
(
"接收到的请求报文是:<br/>"
);
for
(
String
s
:
requestMessage
)
{
sendString
.
append
(
s
+
"<br/>"
);
}
sendString
.
append
(
"</body></html>"
);
buffer
=
ByteBuffer
.
wrap
(
sendString
.
toString
().
getBytes
(
localCharest
));
sc
.
write
(
buffer
);
sc
.
close
();
}
}
@Override
public
void
run
()
{
try
{
// 接收到连接请求时
if
(
key
.
isAcceptable
())
{
handleAccept
();
}
// 读数据
if
(
key
.
isReadable
())
{
handleRead
();
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录