1. 程式人生 > >scala通過akka的actor實現socket http server(NIO非阻塞模式)

scala通過akka的actor實現socket http server(NIO非阻塞模式)

1首先是sbt需要匯入的依賴

name := "HttpServer"

version := "1.0"

scalaVersion := "2.11.8"


libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.4.8" ,
  "com.typesafe.akka" %% "akka-agent" % "2.4.8",
  "com.typesafe.akka" %% "akka-slf4j" % "2.4.8",
  "com.typesafe.akka" %% "akka-testkit" 
% "2.4.8", "com.typesafe.akka" %% "akka-stream" % "2.4.8", "com.typesafe.akka" %% "akka-stream-testkit" % "2.4.8", "javax.servlet" % "javax.servlet-api" % "4.0.0-b06" )

2 scala程式碼

import java.net.{InetSocketAddress}
import java.nio.ByteBuffer
import java.nio.channels.{ServerSocketChannel, 
SocketChannel} import akka.actor.{Actor, ActorSystem, Props} /** * Created by derek on 17-5-29. */ object NioAkkaHttpServer extends App{ val system=ActorSystem("sys") val serverSocketChannel: ServerSocketChannel =ServerSocketChannel.open() serverSocketChannel.socket().setReuseAddress(true) serverSocketChannel
.socket().bind(new InetSocketAddress(8080)) val nioActor=system.actorOf(Props[NioHandler],"handler") while(true) { nioActor ! serverSocketChannel.accept() } } class NioHandler extends Actor{ override def receive = { case socketchannel: SocketChannel=> val buffer = ByteBuffer.allocate(1024) socketchannel.read(buffer) buffer.flip() val request = decode(buffer) val temp = new StringBuffer temp.append("HTTP/1.1 200 OK\r\n") temp.append("Content-Type:text/html\r\n\r\n") println(request) val content=scala.io.Source.fromFile("/home/derek/Documents/test1.html").getLines().mkString temp.append("\r\n") temp.append(content) val bytes = temp.toString.getBytes("UTF-8"); socketchannel.write(ByteBuffer.wrap(bytes)) socketchannel.shutdownOutput() socketchannel.close() case _=> } def decode(buffer:ByteBuffer)={ new String(buffer.array()) } }


3 html提交請求到伺服器

<html>
<body>


<h1>My First Heading</h1>


<p>My first paragraph.</p>
<form method="post" action="http://localhost:8080">  
    name:<input type="text" name="name" /><br>  
    age:<input type="text" name="age" /><br>  
    <input type="submit" />  
</form>  
</body>
</html>


4上面test1.html

<html>
<body>


<h1>My First Heading</h1>
<a href="http://www.w3school.com.cn">W3School</a>
<p>My first paragraph.</p>
</body>
</html>


5用webbench測試併發

webbench -c 300 -t 60 http://localhost:8080/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.


Benchmarking: GET http://localhost:8080/
300 clients, running 60 sec.


Speed=1848419 pages/min, 1386312 bytes/sec.
Requests: 1848419 susceed, 0 failed.