Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import kotlinx.io.core.BytePacketBuilder
- import kotlinx.io.core.ByteReadPacket
- import kotlinx.io.core.buildPacket
- import kotlinx.io.nio.readPacketExact
- import kotlinx.io.nio.writePacket
- import java.net.InetSocketAddress
- import java.nio.channels.ServerSocketChannel
- import java.nio.channels.SocketChannel
- import java.util.*
- import java.util.concurrent.Executors
- class MainActivity : AppCompatActivity() {
- companion object {
- const val PORT = 12345
- }
- private val controls = Arrays.asList(
- Control("Forward", 0), Control("Backward", 1),
- Control("Right", 2), Control("Left", 3)
- )
- private val executor = Executors.newCachedThreadPool()
- private val server = ServerSocketChannel.open().bind(InetSocketAddress(PORT))
- private val channels = ArrayList<SocketChannel>()
- private val responses = HashMap<Byte, ByteReadPacket.() -> Unit>()
- init {
- executor.submit {
- while (server.isOpen) {
- val channel = server.accept()
- synchronized(channels) {
- channels.add(channel)
- }
- executor.submit {
- while (channel.isOpen) {
- val packet = channel.readPacketExact(5)
- val response = responses[(packet.readByte())]
- response?.invoke(channel.readPacketExact(packet.readInt().toLong()))
- }
- synchronized(channels) {
- channels.remove(channel)
- }
- }
- }
- }
- }
- override fun onCreate(bundleIn: Bundle) {
- val binding: MainActivityBinding = inflate(from(this), R.layout.main_activity, null, false)
- controls.forEach { control ->
- val button = Button(this)
- button.setText(control.name);
- button.onClick {
- synchronized(channels) {
- channels.forEach { channel ->
- channel.writePacket {
- writeByte(control.opcode)
- val message = buildPacket {
- control.message(this)
- }
- writeInt(message.remaining)
- writePacket(message)
- }
- }
- }
- }
- binding.controls.addView(button)
- }
- setContentView(binding.getRoot())
- super.onCreate(bundleIn)
- }
- class Control(
- val name: String,
- val opcode: Byte,
- val message: BytePacketBuilder.() -> Unit = {}
- )
- }
Add Comment
Please, Sign In to add comment