62 lines
1.5 KiB
Kotlin
62 lines
1.5 KiB
Kotlin
package util.network.simulator
|
|
|
|
import util.network.simulator.packet.Packet
|
|
import java.util.concurrent.LinkedBlockingQueue
|
|
|
|
abstract class Node(
|
|
val address: Address,
|
|
protected val network: Network,
|
|
bufferSize: Int = 1
|
|
) {
|
|
private val buffer = LinkedBlockingQueue<Packet>(bufferSize)
|
|
private val receiver: Receiver
|
|
private val sender: Sender
|
|
|
|
init {
|
|
network.addNode(this)
|
|
val factory = communicatorFactory(network.threadGroup)
|
|
receiver = factory.createReceiver()
|
|
sender = factory.createSender()
|
|
}
|
|
|
|
fun start() {
|
|
receiver.start()
|
|
sender.start()
|
|
}
|
|
|
|
private fun setPacket(packet: Packet) {
|
|
buffer.put(packet)
|
|
}
|
|
|
|
private fun getPacket(): Packet {
|
|
return buffer.take()
|
|
}
|
|
|
|
protected fun send(packet: Packet) {
|
|
network[packet.receiverAddress]?.setPacket(packet)
|
|
}
|
|
|
|
protected fun receive(): Packet = getPacket()
|
|
|
|
protected abstract fun communicatorFactory(
|
|
threadGroup: ThreadGroup
|
|
): CommunicatorFactory
|
|
|
|
protected abstract inner class CommunicatorFactory(
|
|
protected val threadGroup: ThreadGroup
|
|
) {
|
|
abstract fun createReceiver(): Receiver
|
|
abstract fun createSender(): Sender
|
|
}
|
|
|
|
protected abstract inner class Receiver(threadGroup: ThreadGroup) : Thread(
|
|
threadGroup,
|
|
"${threadGroup.name}-receiver"
|
|
)
|
|
|
|
protected abstract inner class Sender(threadGroup: ThreadGroup) : Thread(
|
|
threadGroup,
|
|
"${threadGroup.name}-sender"
|
|
)
|
|
}
|