Guest User

Untitled

a guest
Apr 20th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. import kotlinx.io.core.BytePacketBuilder
  2. import kotlinx.io.core.ByteReadPacket
  3. import kotlinx.io.core.buildPacket
  4. import kotlinx.io.nio.readPacketExact
  5. import kotlinx.io.nio.writePacket
  6. import java.net.InetSocketAddress
  7. import java.nio.channels.ServerSocketChannel
  8. import java.nio.channels.SocketChannel
  9. import java.util.*
  10. import java.util.concurrent.Executors
  11.  
  12. class MainActivity : AppCompatActivity() {
  13. companion object {
  14. const val PORT = 12345
  15. }
  16.  
  17. private val controls = Arrays.asList(
  18. Control("Forward", 0), Control("Backward", 1),
  19. Control("Right", 2), Control("Left", 3)
  20. )
  21. private val executor = Executors.newCachedThreadPool()
  22. private val server = ServerSocketChannel.open().bind(InetSocketAddress(PORT))
  23. private val channels = ArrayList<SocketChannel>()
  24. private val responses = HashMap<Byte, ByteReadPacket.() -> Unit>()
  25.  
  26. init {
  27. executor.submit {
  28. while (server.isOpen) {
  29. val channel = server.accept()
  30. synchronized(channels) {
  31. channels.add(channel)
  32. }
  33. executor.submit {
  34. while (channel.isOpen) {
  35. val packet = channel.readPacketExact(5)
  36. val response = responses[(packet.readByte())]
  37. response?.invoke(channel.readPacketExact(packet.readInt().toLong()))
  38. }
  39. synchronized(channels) {
  40. channels.remove(channel)
  41. }
  42. }
  43. }
  44. }
  45. }
  46.  
  47. override fun onCreate(bundleIn: Bundle) {
  48. val binding: MainActivityBinding = inflate(from(this), R.layout.main_activity, null, false)
  49.  
  50. controls.forEach { control ->
  51. val button = Button(this)
  52. button.setText(control.name);
  53. button.onClick {
  54. synchronized(channels) {
  55. channels.forEach { channel ->
  56. channel.writePacket {
  57. writeByte(control.opcode)
  58. val message = buildPacket {
  59. control.message(this)
  60. }
  61. writeInt(message.remaining)
  62. writePacket(message)
  63. }
  64. }
  65. }
  66. }
  67. binding.controls.addView(button)
  68. }
  69.  
  70. setContentView(binding.getRoot())
  71. super.onCreate(bundleIn)
  72. }
  73.  
  74. class Control(
  75. val name: String,
  76. val opcode: Byte,
  77. val message: BytePacketBuilder.() -> Unit = {}
  78. )
  79. }
Add Comment
Please, Sign In to add comment