io.netty.channel.socket.nio.NioSocketChannel Scala Examples
The following examples show how to use io.netty.channel.socket.nio.NioSocketChannel.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: EventLoopGroupOwner.scala From daml with Apache License 2.0 | 5 votes |
// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.daml.platform.apiserver import java.util.UUID import java.util.concurrent.TimeUnit.MILLISECONDS import com.daml.resources.{Resource, ResourceOwner} import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.{NioServerSocketChannel, NioSocketChannel} import io.netty.channel.{Channel, EventLoopGroup, ServerChannel} import io.netty.util.concurrent.DefaultThreadFactory import scala.concurrent.{ExecutionContext, Future, Promise} import scala.util.Try final class EventLoopGroupOwner(threadPoolName: String, parallelism: Int) extends ResourceOwner[EventLoopGroup] { override def acquire()(implicit executionContext: ExecutionContext): Resource[EventLoopGroup] = Resource( Future(new NioEventLoopGroup( parallelism, new DefaultThreadFactory(s"$threadPoolName-grpc-event-loop-${UUID.randomUUID()}", true))))( group => { val promise = Promise[Unit]() val future = group.shutdownGracefully(0, 0, MILLISECONDS) future.addListener((f: io.netty.util.concurrent.Future[_]) => promise.complete(Try(f.get).map(_ => ()))) promise.future } ) } object EventLoopGroupOwner { val clientChannelType: Class[_ <: Channel] = classOf[NioSocketChannel] val serverChannelType: Class[_ <: ServerChannel] = classOf[NioServerSocketChannel] }
Example 2
Source File: ParticipantSessionManager.scala From daml with Apache License 2.0 | 5 votes |
// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.daml.ledger.api.testtool.infrastructure.participant import io.grpc.netty.{NegotiationType, NettyChannelBuilder} import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import io.netty.util.concurrent.DefaultThreadFactory import org.slf4j.LoggerFactory import scala.collection.concurrent.TrieMap import scala.concurrent.{ExecutionContext, Future} private[infrastructure] final class ParticipantSessionManager { private[this] val logger = LoggerFactory.getLogger(classOf[ParticipantSession]) private[this] val channels = TrieMap.empty[ParticipantSessionConfiguration, ParticipantSession] @throws[RuntimeException] private def create( config: ParticipantSessionConfiguration, )(implicit ec: ExecutionContext): ParticipantSession = { logger.info(s"Connecting to participant at ${config.host}:${config.port}...") val threadFactoryPoolName = s"grpc-event-loop-${config.host}-${config.port}" val daemonThreads = false val threadFactory: DefaultThreadFactory = new DefaultThreadFactory(threadFactoryPoolName, daemonThreads) logger.info( s"gRPC thread factory instantiated with pool '$threadFactoryPoolName' (daemon threads: $daemonThreads)", ) val threadCount = Runtime.getRuntime.availableProcessors val eventLoopGroup: NioEventLoopGroup = new NioEventLoopGroup(threadCount, threadFactory) logger.info( s"gRPC event loop thread group instantiated with $threadCount threads using pool '$threadFactoryPoolName'", ) val managedChannelBuilder = NettyChannelBuilder .forAddress(config.host, config.port) .eventLoopGroup(eventLoopGroup) .channelType(classOf[NioSocketChannel]) .directExecutor() .usePlaintext() for (ssl <- config.ssl; sslContext <- ssl.client) { logger.info("Setting up managed communication channel with transport security") managedChannelBuilder .useTransportSecurity() .sslContext(sslContext) .negotiationType(NegotiationType.TLS) } managedChannelBuilder.maxInboundMessageSize(10000000) val managedChannel = managedChannelBuilder.build() logger.info(s"Connection to participant at ${config.host}:${config.port}") new ParticipantSession(config, managedChannel, eventLoopGroup) } def getOrCreate( configuration: ParticipantSessionConfiguration, )(implicit ec: ExecutionContext): Future[ParticipantSession] = Future(channels.getOrElseUpdate(configuration, create(configuration))) def close(configuration: ParticipantSessionConfiguration): Unit = channels.get(configuration).foreach(_.close()) def closeAll(): Unit = for ((_, session) <- channels) { session.close() } }
Example 3
Source File: WavesBlockchainClientBuilder.scala From matcher with MIT License | 5 votes |
package com.wavesplatform.dex.grpc.integration import com.wavesplatform.dex.domain.utils.ScorexLogging import com.wavesplatform.dex.grpc.integration.clients.{WavesBlockchainCachingClient, WavesBlockchainClient, WavesBlockchainGrpcAsyncClient} import com.wavesplatform.dex.grpc.integration.settings.WavesBlockchainClientSettings import io.grpc.ManagedChannel import io.grpc.internal.DnsNameResolverProvider import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import monix.execution.Scheduler import scala.concurrent.{ExecutionContext, Future} object WavesBlockchainClientBuilder extends ScorexLogging { def async(wavesBlockchainClientSettings: WavesBlockchainClientSettings, monixScheduler: Scheduler, grpcExecutionContext: ExecutionContext): WavesBlockchainClient[Future] = { log.info(s"Building gRPC client for server: ${wavesBlockchainClientSettings.grpc.target}") val eventLoopGroup = new NioEventLoopGroup val channel: ManagedChannel = wavesBlockchainClientSettings.grpc.toNettyChannelBuilder .nameResolverFactory(new DnsNameResolverProvider) .executor((command: Runnable) => grpcExecutionContext.execute(command)) .eventLoopGroup(eventLoopGroup) .channelType(classOf[NioSocketChannel]) .usePlaintext() .build new WavesBlockchainCachingClient( new WavesBlockchainGrpcAsyncClient(eventLoopGroup, channel, monixScheduler)(grpcExecutionContext), wavesBlockchainClientSettings.defaultCachesExpiration, monixScheduler )(grpcExecutionContext) } }
Example 4
Source File: RealmConnector.scala From wowchat with GNU General Public License v3.0 | 5 votes |
package wowchat.realm import java.net.InetSocketAddress import java.util.concurrent.TimeUnit import wowchat.common._ import com.typesafe.scalalogging.StrictLogging import io.netty.bootstrap.Bootstrap import io.netty.channel.socket.SocketChannel import io.netty.channel.socket.nio.NioSocketChannel import io.netty.channel.{Channel, ChannelInitializer, ChannelOption} import io.netty.handler.timeout.IdleStateHandler import io.netty.util.concurrent.Future import scala.util.Try class RealmConnector(realmConnectionCallback: RealmConnectionCallback) extends StrictLogging { private var channel: Option[Channel] = None private var connected: Boolean = false def connect: Unit = { logger.info(s"Connecting to realm server ${Global.config.wow.realmlist.host}:${Global.config.wow.realmlist.port}") val bootstrap = new Bootstrap bootstrap.group(Global.group) .channel(classOf[NioSocketChannel]) .option[java.lang.Integer](ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) .option[java.lang.Boolean](ChannelOption.SO_KEEPALIVE, true) .remoteAddress(new InetSocketAddress(Global.config.wow.realmlist.host, Global.config.wow.realmlist.port)) .handler(new ChannelInitializer[SocketChannel]() { @throws[Exception] override protected def initChannel(socketChannel: SocketChannel): Unit = { val handler = if (WowChatConfig.getExpansion == WowExpansion.Vanilla) { new RealmPacketHandler(realmConnectionCallback) } else { new RealmPacketHandlerTBC(realmConnectionCallback) } socketChannel.pipeline.addLast( new IdleStateHandler(60, 120, 0), new IdleStateCallback, new RealmPacketDecoder, new RealmPacketEncoder, handler ) } }) channel = Some(bootstrap.connect.addListener((future: Future[_ >: Void]) => { Try { future.get(10, TimeUnit.SECONDS) }.fold(throwable => { logger.error(s"Failed to connect to realm server! ${throwable.getMessage}") realmConnectionCallback.disconnected }, _ => Unit) }).channel) } }
Example 5
Source File: ScheduleExamples.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter7 import io.netty.channel.socket.nio.NioSocketChannel import java.util.concurrent.Executors import java.util.concurrent.TimeUnit def cancelingTaskUsingScheduledFuture(): Unit = { val ch = CHANNEL_FROM_SOMEWHERE //调度任务,并获得所返回的ScheduledFuture val future = ch.eventLoop.scheduleAtFixedRate(new Runnable() { override def run(): Unit = { System.out.println("Run every 60 seconds") } }, 60, 60, TimeUnit.SECONDS) // Some other code that runs... val mayInterruptIfRunning = false //取消该任务,防止它再次运行 future.cancel(mayInterruptIfRunning) } }
Example 6
Source File: ChannelFutures.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter6 import io.netty.buffer.Unpooled import io.netty.channel.ChannelFuture import io.netty.channel.ChannelFutureListener import io.netty.channel.socket.nio.NioSocketChannel def addingChannelFutureListener(): Unit = { val channel = CHANNEL_FROM_SOMEWHERE // get reference to pipeline; val someMessage = SOME_MSG_FROM_SOMEWHERE //... val future = channel.write(someMessage) future.addListener(new ChannelFutureListener() { override def operationComplete(f: ChannelFuture): Unit = { if (!f.isSuccess) { f.cause.printStackTrace() f.channel.close } } }) } }
Example 7
Source File: ChannelOperationExamples.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter4 import io.netty.buffer.Unpooled import io.netty.channel.ChannelFuture import io.netty.channel.ChannelFutureListener import io.netty.channel.socket.nio.NioSocketChannel import io.netty.util.CharsetUtil import java.util.concurrent.Executors def writingToChannelFromManyThreads(): Unit = { val channel = CHANNEL_FROM_SOMEWHERE //创建持有要写数据的ByteBuf val buf = Unpooled.copiedBuffer("your data", CharsetUtil.UTF_8) //创建将数据写到Channel 的 Runnable val writer: Runnable = () ⇒ channel.write(buf.duplicate()) //获取到线程池Executor 的引用 val executor = Executors.newCachedThreadPool //递交写任务给线程池以便在某个线程中执行 // write in one thread executor.execute(writer) //递交另一个写任务以便在另一个线程中执行 // write in another thread executor.execute(writer) //... } }
Example 8
Source File: EchoClient.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter2.echoclient import io.netty.bootstrap.Bootstrap import io.netty.channel.ChannelInitializer import io.netty.channel.EventLoopGroup import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.SocketChannel import io.netty.channel.socket.nio.NioSocketChannel import java.net.InetSocketAddress object EchoClient { @throws[Exception] def main(args: Array[String]): Unit = { if (args.length != 2) { System.err.println("Usage: " + classOf[EchoClient].getSimpleName + " <host> <port>") } else { val host = args(0) val port = args(1).toInt new EchoClient(host, port).start() } } } class EchoClient(val host: String, val port: Int) { @throws[Exception] def start(): Unit = { val group: EventLoopGroup = new NioEventLoopGroup try { //创建 Bootstrap val b = new Bootstrap //指定 EventLoopGroup 以处理客户端事件;需要适用于 NIO 的实现 b.group(group) //适用于 NIO 传输的Channel 类型 .channel(classOf[NioSocketChannel]) //设置服务器的InetSocketAddress .remoteAddress(new InetSocketAddress(host, port)) //在创建Channel时,向 ChannelPipeline中添加一个 EchoClientHandler实例 .handler { new ChannelInitializer[SocketChannel]() { @throws[Exception] override def initChannel(ch: SocketChannel): Unit = { ch.pipeline.addLast(new EchoClientHandler) } } } //连接到远程节点,阻塞等待直到连接完成 val f = b.connect.sync() //阻塞,直到Channel 关闭 f.channel.closeFuture.sync() } finally { //关闭线程池并且释放所有的资源 group.shutdownGracefully.sync() } } }
Example 9
Source File: BootstrapClient.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter8 import io.netty.bootstrap.Bootstrap import io.netty.buffer.ByteBuf import io.netty.channel._ import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import java.net.InetSocketAddress def bootstrap(): Unit = { //设置 EventLoopGroup,提供用于处理 Channel 事件的 EventLoop val group: EventLoopGroup = new NioEventLoopGroup //创建一个Bootstrap类的实例以创建和连接新的客户端Channel val bootstrap = new Bootstrap bootstrap.group(group) //指定要使用的Channel 实现 .channel(classOf[NioSocketChannel]) //设置用于 Channel 事件和数据的ChannelInboundHandler .handler { new SimpleChannelInboundHandler[ByteBuf]() { @throws[Exception] override protected def channelRead0( channelHandlerContext: ChannelHandlerContext, byteBuf: ByteBuf): Unit = { println("Received data") } } } //连接到远程主机 val future = bootstrap.connect(new InetSocketAddress("www.manning.com", 80)) future.addListener(new ChannelFutureListener() { @throws[Exception] override def operationComplete(channelFuture: ChannelFuture): Unit = { if (channelFuture.isSuccess) println("Connection established") else { System.err.println("Connection attempt failed") channelFuture.cause.printStackTrace() } } }) } }
Example 10
Source File: GracefulShutdown.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter8 import io.netty.bootstrap.Bootstrap import io.netty.buffer.ByteBuf import io.netty.channel._ import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import io.netty.util.concurrent.Future import java.net.InetSocketAddress def bootstrap(): Unit = { //创建处理 I/O 的EventLoopGroup val group = new NioEventLoopGroup //创建一个 Bootstrap 类的实例并配置它 val bootstrap = new Bootstrap bootstrap.group(group) .channel(classOf[NioSocketChannel]) .handler( new SimpleChannelInboundHandler[ByteBuf]() { @throws[Exception] override protected def channelRead0(channelHandlerContext: ChannelHandlerContext, byteBuf: ByteBuf): Unit = { System.out.println("Received data") } } ) bootstrap.connect(new InetSocketAddress("www.manning.com", 80)).syncUninterruptibly() //shutdownGracefully()方法将释放所有的资源,并且关闭所有的当前正在使用中的 Channel val future = group.shutdownGracefully() // block until the group has shutdown future.syncUninterruptibly() } }
Example 11
Source File: BootstrapSharingEventLoopGroup.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter8 import io.netty.bootstrap.Bootstrap import io.netty.bootstrap.ServerBootstrap import io.netty.buffer.ByteBuf import io.netty.channel.ChannelFuture import io.netty.channel.ChannelFutureListener import io.netty.channel.ChannelHandlerContext import io.netty.channel.SimpleChannelInboundHandler import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel import java.net.InetSocketAddress def bootstrap(): Unit = { //创建 ServerBootstrap 以创建 ServerSocketChannel,并绑定它 val bootstrap = new ServerBootstrap //设置 EventLoopGroup,其将提供用以处理 Channel 事件的 EventLoop bootstrap.group(new NioEventLoopGroup, new NioEventLoopGroup) //指定要使用的 Channel 实现 .channel(classOf[NioServerSocketChannel]) //设置用于处理已被接受的子 Channel 的 I/O 和数据的 ChannelInboundHandler .childHandler { new SimpleChannelInboundHandler[ByteBuf]() { private[chapter8] var connectFuture: ChannelFuture = _ @throws[Exception] override def channelActive(ctx: ChannelHandlerContext): Unit = { //创建一个 Bootstrap 类的实例以连接到远程主机 val bootstrap = new Bootstrap //指定 Channel 的实现 bootstrap.channel(classOf[NioSocketChannel]) .handler(new SimpleChannelInboundHandler[ByteBuf]() { @throws[Exception] override protected def channelRead0( ctx: ChannelHandlerContext, in: ByteBuf): Unit = { println("Received data") } }) //使用与分配给已被接受的子Channel相同的EventLoop bootstrap.group(ctx.channel.eventLoop) //连接到远程节点 connectFuture = bootstrap.connect(new InetSocketAddress("www.manning.com", 80)) } @throws[Exception] override protected def channelRead0( channelHandlerContext: ChannelHandlerContext, byteBuf: ByteBuf): Unit = { if (connectFuture.isDone) { //当连接完成时,执行一些数据操作(如代理) // do something with the data } } } } //通过配置好的 ServerBootstrap 绑定该 ServerSocketChannel val future = bootstrap.bind(new InetSocketAddress(8080)) future.addListener(new ChannelFutureListener() { @throws[Exception] override def operationComplete(channelFuture: ChannelFuture): Unit = { if (channelFuture.isSuccess) System.out.println("Server bound") else { System.err.println("Bind attempt failed") channelFuture.cause.printStackTrace() } } }) } }
Example 12
Source File: BootstrapClientWithOptionsAndAttrs.scala From netty-in-action-scala with Apache License 2.0 | 5 votes |
package nia.chapter8 import io.netty.bootstrap.Bootstrap import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelOption import io.netty.channel.SimpleChannelInboundHandler import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import io.netty.util.AttributeKey import java.net.InetSocketAddress import java.lang.{ Boolean ⇒ JBoolean } def bootstrap(): Unit = { //创建一个 AttributeKey 以标识该属性 val id: AttributeKey[Integer] = AttributeKey.newInstance("ID") //创建一个 Bootstrap 类的实例以创建客户端 Channel 并连接它们 val bootstrap = new Bootstrap //设置 EventLoopGroup,其提供了用以处理 Channel 事件的 EventLoop bootstrap.group(new NioEventLoopGroup) .channel(classOf[NioSocketChannel]) .handler(new SimpleChannelInboundHandler[ByteBuf]() { @throws[Exception] override def channelRegistered(ctx: ChannelHandlerContext): Unit = { //使用 AttributeKey 检索属性以及它的值 val idValue = ctx.channel.attr(id).get // do something with the idValue } @throws[Exception] override protected def channelRead0(channelHandlerContext: ChannelHandlerContext, byteBuf: ByteBuf): Unit = { System.out.println("Received data") } }) //设置 ChannelOption,其将在 connect()或者bind()方法被调用时被设置到已经创建的 Channel 上 bootstrap .option[JBoolean](ChannelOption.SO_KEEPALIVE, true) .option[Integer](ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) //存储该 id 属性 bootstrap.attr[Integer](id, 123456) //使用配置好的 Bootstrap 实例连接到远程主机 val future = bootstrap.connect(new InetSocketAddress("www.manning.com", 80)) future.syncUninterruptibly } }
Example 13
Source File: PacketProxy.scala From Neutrino with Apache License 2.0 | 5 votes |
package com.ebay.neutrino import java.net.{InetAddress, InetSocketAddress, SocketAddress} import com.ebay.neutrino.util.Utilities import scala.concurrent.Future import scala.util.{Failure, Success} import com.typesafe.scalalogging.slf4j.StrictLogging import io.netty.bootstrap.{Bootstrap, ServerBootstrap} import io.netty.channel.ChannelHandler.Sharable import io.netty.channel._ import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.{NioServerSocketChannel, NioSocketChannel} import io.netty.util.AttributeKey override def channelRead(ctx: ChannelHandlerContext, msg: AnyRef) { println("Writing packet from downstream to upstream...") upstream.writeAndFlush(msg) //ctx.fireChannelRead(msg) } override def channelInactive(ctx: ChannelHandlerContext): Unit = { println("Downstream closing..") upstream.close() ctx.fireChannelInactive() } }
Example 14
Source File: NetworkClient.scala From Waves with MIT License | 5 votes |
package com.wavesplatform.network.client import java.io.IOException import java.net.InetSocketAddress import com.wavesplatform.Version import com.wavesplatform.network.{Handshake, TrafficLogger} import com.wavesplatform.settings._ import com.wavesplatform.utils.ScorexLogging import io.netty.bootstrap.Bootstrap import io.netty.channel._ import io.netty.channel.group.ChannelGroup import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioSocketChannel import scala.concurrent.{Future, Promise} class NetworkClient(trafficLoggerSettings: TrafficLogger.Settings, chainId: Char, nodeName: String, nonce: Long, allChannels: ChannelGroup) extends ScorexLogging { private val workerGroup = new NioEventLoopGroup() private val handshake = Handshake(Constants.ApplicationName + chainId, Version.VersionTuple, nodeName, nonce, None) def connect(remoteAddress: InetSocketAddress): Future[Channel] = { val p = Promise[Channel] val bootstrap = new Bootstrap() .group(workerGroup) .channel(classOf[NioSocketChannel]) .handler(new LegacyChannelInitializer(trafficLoggerSettings, handshake, p)) log.debug(s"Connecting to $remoteAddress") val channelFuture = bootstrap.connect(remoteAddress) channelFuture.addListener((_: io.netty.util.concurrent.Future[Void]) => { log.debug(s"Connected to $remoteAddress") channelFuture.channel().write(p) }) val channel = channelFuture.channel() allChannels.add(channel) channel.closeFuture().addListener { (chf: ChannelFuture) => if (!p.isCompleted) { val cause = Option(chf.cause()).getOrElse(new IllegalStateException("The connection is closed before handshake")) p.failure(new IOException(cause)) } log.debug(s"Connection to $remoteAddress closed") allChannels.remove(chf.channel()) } p.future } def shutdown(): Unit = try { allChannels.close().await() log.debug("Closed all channels") } finally { workerGroup.shutdownGracefully() } }
Example 15
Source File: NettyUtils.scala From aloha with Apache License 2.0 | 5 votes |
package me.jrwang.aloha.transport.util import io.netty.buffer.PooledByteBufAllocator import io.netty.channel.{Channel, EventLoopGroup, ServerChannel} import io.netty.channel.epoll.{EpollEventLoopGroup, EpollServerSocketChannel, EpollSocketChannel} import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.{NioServerSocketChannel, NioSocketChannel} import io.netty.util.concurrent.DefaultThreadFactory import io.netty.util.internal.PlatformDependent import me.jrwang.aloha.common.Logging object NettyUtils extends Logging { private def getPrivateStaticField(name: String) = try { val f = PooledByteBufAllocator.DEFAULT.getClass.getDeclaredField(name) f.setAccessible(true) f.getInt(null) } catch { case e: Exception => throw new RuntimeException(e) } }