scala akka 修炼之路3(基于java nio的socket编程)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


package

 

import
import
import
import
import
import
import
import
import
import
import
 
case class StartService(port: Int)
class ServerActor extends
val serverChannel
  valserverSocket =serverChannel.socket()
val selector
 
val buffer = ByteBuffer.allocate(1024)
val charset = Charset.forName("UTF-8")
val charDecoder =charset.newDecoder()
 
def
case StartService(port) =>
this.serverListenerStart(port)
  }
def
serverSocket.bind(new
serverChannel.configureBlocking(false)
serverChannel.register(selector, SelectionKey.OP_ACCEPT)
var n =0
while (true) {
n = selector.select()
if (n >0) {
val it =selector.selectedKeys().iterator()
while (it.hasNext()) {
val key =it.next()
it.remove() 删除已选key,防止重复处理
if (key.isAcceptable()) {
val server =key.channel().asInstanceOf[ServerSocketChannel]
val channel =server.accept()
channel)
if (null !=channel) {
channel.configureBlocking(false)
channel.register(selector, SelectionKey.OP_READ)
            }
else if (key.isReadable()) {
val socket =key.channel().asInstanceOf[SocketChannel]
var size: Int =0
"read data ....." + key)
buffer.clear()
size = socket.read(buffer)
while (size >0) {
buffer.flip()
charDecoder.decode(buffer.asReadOnlyBuffer())
"\\.\\.\\.\\.").foreach(println)
buffer.clear()
size = socket.read(buffer)
            }
            if (size == -1) { //当对端主动关闭后移除key,要不然selector会一直返回可读
socket.close()
selector.selectedKeys().remove(key)
            }
          }
        }
      }
    }
  }
}
class ClientActor extends
val client
val buffer = ByteBuffer.allocate(1024)
def
case StartService(port) =>
port)
  }
def
client.connect(new
while (true) {
 
for (i <-1 to5) {
buffer.clear()
buffer.put(("hello server" +i +"....").getBytes("utf8"))
buffer.flip()
client.write(buffer)
      }
 
1000)
"message to parent....")
    }
  }
}
object
def
this.akkaSocketTest("socketActor",11111)
  }
def
val actorSystem
val serverActor =actorSystem.actorOf(Props[ServerActor],"serverActor")
val clientActor =actorSystem.actorOf(Props[ClientActor],"clientActor")
val startCMD =new
 
    serverActor !startCMD
    clientActor !startCMD
  }
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java