一种方式是写入比MTU大的数据
一种是通过charles限制MTU大小
fun main(args: Array<String>) {
val serverSocketChannel = ServerSocketChannel.open()
serverSocketChannel.configureBlocking(false)
serverSocketChannel.socket().bind(InetSocketAddress(8080), 1024)
val selector = Selector.open()
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT)
while(true){
selector.select()
val iterator = selector.selectedKeys().iterator()
while (iterator.hasNext()) {
val key = iterator.next()
//必须remove 坑1
iterator.remove()
if (key.isAcceptable){
val scc = key.channel() as ServerSocketChannel
val socketChannel = scc.accept()
socketChannel.configureBlocking(false)
socketChannel.register(selector, SelectionKey.OP_READ)
}
if (key.isReadable) {
println("--------------------------")
val socketChannel = key.channel() as SocketChannel
val buffer = ByteBuffer.allocate(1024)
val length = socketChannel.read(buffer)
if (length > 0) {
buffer.flip()
val byteArray = ByteArray(length)
while (buffer.hasRemaining()) {
buffer.get(byteArray)
}
println(String(byteArray))
}
//必须处理客户端关闭,否则会一直可读 坑2
if (length < 0){
key.cancel()
socketChannel.close()
}
if (length == 0) {
//不处理
}
}
}
}
}
结果
--------------------------
GET /favicon.ico HTTP/1.1
Host: 10.0.96.147:808
--------------------------
0
User-Agent: Mozilla/5.0 (Linux; U; Android 8.
--------------------------
1.0; zh-cn; MI 8 Build/OPM1.171019.026) AppleWeb
--------------------------
Kit/537.36 (KHTML, like Gecko) Version/4.0 Chrom
--------------------------
e/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.3.0
Accept: image/webp,image/apng,im
--------------------------
age/*,*/*;q=0.8
Referer: http://10.0.96.147:808
--------------------------
0/
Accept-Encoding: gzip, deflate
Accept-Langu
--------------------------
age: zh-CN,en-US;q=0.8
Connection: keep-alive
--------------------------