Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin WebSocket握手响应缺少HTTP状态行_Kotlin_Websocket_Tcp_Rfc6455 - Fatal编程技术网

Kotlin WebSocket握手响应缺少HTTP状态行

Kotlin WebSocket握手响应缺少HTTP状态行,kotlin,websocket,tcp,rfc6455,Kotlin,Websocket,Tcp,Rfc6455,由于对该主题感兴趣,我决定尝试使用TCP为Kotlin创建WebSocket客户端库 因此,我正在阅读RFC6455,它提到在握手中,服务器响应应该有一个HTTP状态行。酷,我提出我的要求: GET / HTTP/1.1 Host: echo.websocket.org:80 Upgrade: websocket Connection: Upgrade Accept: */* Sec-WebSocket-Version: 13 Sec-WebSocket-Key: Dg8CY18ZTGbAkIz

由于对该主题感兴趣,我决定尝试使用TCP为Kotlin创建WebSocket客户端库

因此,我正在阅读RFC6455,它提到在握手中,服务器响应应该有一个HTTP状态行。酷,我提出我的要求:

GET / HTTP/1.1
Host: echo.websocket.org:80
Upgrade: websocket
Connection: Upgrade
Accept: */*
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: Dg8CY18ZTGbAkIzNhpO3mA==
然后服务器以

Connection: Upgrade
Sec-WebSocket-Accept: akyZ/0pr8WyuXVfejRWVAUGSW3k=
Upgrade: websocket
如您所见,没有HTTP状态行。我是否在RFC6455中遗漏了什么,我的代码是否愚蠢

代码(PayloadFactory.kt):

fun createSecWebSocketKey():字符串?{
val字节=字节数组(16)
SecureRandom.getInstanceStrong().nextBytes(字节)
返回字符串(Base64.getEncoder().encode(字节)!!)
}
fun createOpeningHandshake(主机:String,路径:String=“/”,端口:Int=80,协议版本:Int=13):String
{
//我知道还没有使用path,这是我计划实现但尚未实现的。
var handshake=“”
握手+=“GET/HTTP/1.1\r\n”
握手+=“主机:$Host:$port\r\n”
握手+=“升级:websocket\r\n”
握手+=“连接:升级\r\n”
握手+=“接受:*/*\r\n”
握手+=“秒WebSocket版本:$protocolVersion\r\n”
握手+=“Sec WebSocket密钥:${CreateSecWebSocket()}\r\n\r\n”
回击握手
}
代码(WebSocket.kt):

类WebSocket(协议:字符串,主机:字符串,端口:Int=80,协议版本:Int=13){
专用val客户端:套接字=套接字(主机、端口)
private val globallyUniqueIdentifier=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”
初始化{
val握手=createOpeningHandshake(主机,协议版本=协议版本)
println(“===================客户端握手====================”)
println(握手)
client.getOutputStream().write(handshake.toByteArray())
println(“===================服务器响应====================”)
val input=BufferedReader(InputStreamReader(client.getInputStream()))
while(true)
{
if(input.readLine()!=null){
val line=input.readLine()
println(行)
}
}
}
}
要运行:
WebSocket(“ws”,“echo.WebSocket.org”,80)
已解决


我没有将readLine()的结果存储在一个变量中,这导致我实际上放弃了响应中的每一行。感谢用户207421指出这一点

你把每一行奇怪的回答都扔掉了。您需要将第一个
readLine()
的结果存储到一个变量中,测试它是否为null,如果不是,则显示它。并且不执行第二个
readLine()
。如果它是空的,你需要退出读取循环。user207421你太棒了,我自己应该看到这个,但是非常感谢你指出它并解决了我的问题!一点也不惊人,只是经验丰富而已。通常的编写方法是
while((line=input.readLine())!=null){…}
。谢谢,我只是个白痴。我9岁就开始编码了,现在我17岁了,我应该看到这个错误。非常感谢你!感谢您以更高效的方式编写循环,我非常感谢!(小提示:我们在主题行中不使用[已解决的]设备-而是单击答案上的勾号/复选标记。我们倾向于不鼓励在帖子中提供投票建议/评论-我们认为这没有任何效果,或者可能会鼓励人们投反对票。无论如何,这对大多数读者都没有用处。如果你愿意,请将其放在评论中)。