저는 줄리아 서버 프로세스가 이진 데이터와 관련된 메시지를 주기적으로 게시하는 프로젝트를 진행 중입니다. 초기 클라이언트는 자바 스크립트로 작성되지만 궁극적으로 다양한 방식으로 구현 된 여러 클라이언트를 보유하는 기능을 원합니다. 따라서 프로토콜 버퍼를 사용하여 메시지를 정의하고 싶습니다. 3 개의 Julia websocket 구현을 찾았습니다 : WebSockets.jl
, SimpleSockets.jl
그리고 HTTP.jl
의 WebSockets. 몇 가지 순진한 실험을 WebSockets.jl
했고 오류가 발생했습니다 ( "WebSockets는 바이트 I / O를 지원하지 않습니다"). 나의 목표는 HTTP.jl
구현에 초점을 맞추는 것입니다. 보다 적극적인 개발중인 느낌이 듭니다 WebSockets.jl
.
업데이트 : 실험을 계속했습니다. 나는 이전의 SO 질문으로 안내 받았는데 , websocket에 바이너리 데이터를 쓸 수 없었습니다 . 링크에서 서버 구현을 모델링하여 다음을 산출했습니다.
include("testmessage_pb.jl")
text = "A man spekith"
msg = TestMessage(someText=text)
function server(port)
@async HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
while !eof(ws)
data = readavailable(ws)
IOExtras.startwrite(ws)
writeproto(ws, msg)
IOExtras.closewrite(ws)
end
end
end
end
end
그것을 실행하면 이전에보고 한 것과 매우 유사한 오류가 발생했습니다. HTTP.WebSockets.WebSocket{HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}} does not support byte I/O
이 글을 읽는 사람이이 특정 기술 클러스터 (julia, protobuf, websockets)에 대한 경험이 있고 진행 방법에 대한 제안 ( "시도하지 마십시오"가 유용한 피드백으로 간주 됨)이 있는지 궁금합니다.
질문에서 보여준 서버 구현을 조정할 수 있었고 이제 작동합니다. 약간 투박하고 더 좋은 접근 방식이 나오기를 바라면서 내 대답을 받아들이지 않을 것입니다. 어쨌든 다음은 새 버전입니다.
function server(port)
@async HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
while !eof(ws)
data = readavailable(ws)
iob = PipeBuffer()
writeproto(iob, msg)
write(ws, take!(iob))
end
end
end
end
end
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다