sockets - 如何在 Haskell 中从套接字发送和接收消息
问题描述
我正在尝试TCP
在 Haskell 中创建服务器,到目前为止,我无法从谷歌浏览器扩展打开连接并保持打开状态:
错误
Server.exe: Network.Socket.sendBuf: failed (Unknown error)
代码
import Network.Socket
import qualified Network.Socket.ByteString as B
import Data.ByteString.Char8(pack,unpack)
main::IO()
main=do
sock<-socket AF_INET Stream 0
bind sock (SockAddrInet 8500 iNADDR_ANY)
listen sock 3
(csock,_)<-accept sock
loop csock
loop::Socket->IO()
loop csock=do
print "Begining of loop"
-- dat<-B.recv csock 2000
sent<-B.send csock $ pack "Hi!!"
-- print $ unwords ["Received :",unpack dat]
print "End of loop"
loop csock
我首先尝试只发送消息,我得到错误,如果我取消注释recv
它挂起的行
带有注释行的输出
"Begining of loop"
"End of loop"
"Begining of loop"
"End of loop"
"Begining of loop"
"End of loop"
"Begining of loop"
Server.exe: Network.Socket.sendBuf: failed (Unknown error)
带有未注释行的输出
"Begining of loop"
"Received : GET / HTTP/1.1\r\nHost: localhost:8500\r\nConnection: Upgrade\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade: websocket\r\nOrigin: chrome-extension://pfdhoblngboilpfeibdedpjgfnlcodoo\r\nSec-WebSocket-Version: 13\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/73.0.3683.103 Safari/537.36\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: en,en-US;q=0.9,ro;q=0.8\r\nSec-WebSocket-Key: WY87jPXNRfk/WM5T20O8Jg==\r\nSec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n"
"End of loop"
"Begining of loop"
PS
我Simple WebSocket Client
在 Chrome 上使用 -extension 并且在这两种情况下,连接都显示为“正在打开”而不是“打开”,即使程序运行了几次迭代,如您在输出中看到的那样
解决方案
服务器工作得很好。问题是我试图使用Chrome Simple WebSocket Client
扩展名进行连接,顾名思义,它试图打开一个WebSocket
连接,而我的服务器处理简单Socket
的连接。
我尝试使用连接到服务器telnet
,它工作得很好(发送和接收)。
推荐阅读
- python - 在 RHEL 环境中与 os.path.join 连接的路径使用两个不同的分隔符
- angular - Angular 服务比 Typescript 单例方法更好吗?
- c# - 在表单提交中,只有单选按钮不传递值
- intellij-idea - 在 IntelliJ 上组合 yaml 文件的键
- opengl - 基于 Voronoi 模式计算法线
- redis - 可扩展微服务架构中的 Rabbitmq、Redis 和 Hazlecast
- swift - 快速获取数组中的所有联系电话号码
- javascript - 如何在 JEST 文档中模拟 webview 或 iframe 等 html 元素?
- r - 如何将单个日期列转换为三个单独的列(y、m、d)?
- python - 在烧瓶 HTML 模板中运行 python 模块