Sockets 如何在Haskell中从套接字发送和接收消息

Sockets 如何在Haskell中从套接字发送和接收消息,sockets,haskell,tcp,Sockets,Haskell,Tcp,我正在尝试在Haskell中创建TCP服务器,但到目前为止,我无法从google浏览器扩展打开连接并保持其打开状态: 错误 Server.exe:Network.Socket.sendBuf:失败(未知错误) 代码 import Network.Socket import qualified Network.Socket.ByteString as B import Data.ByteString.Char8(pack,unpack) main::IO() main=do sock&l

我正在尝试在Haskell中创建
TCP
服务器,但到目前为止,我无法从google浏览器扩展打开连接并保持其打开状态:

错误

Server.exe:Network.Socket.sendBuf:失败(未知错误)

代码

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
带有未注释行的输出

"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"
p.S
我在Chrome上使用的是
Simple WebSocket Client
-扩展,在这两种情况下,连接都显示为“打开”而不是“打开”,即使程序运行了两次迭代,正如您在输出中看到的那样服务器工作正常。问题是我试图使用
Chrome Simple WebSocket Client
扩展进行连接,顾名思义,该扩展尝试打开
WebSocket
连接,而我的服务器处理简单的
套接字
连接


我尝试使用
telnet
连接到服务器,它工作得很好(发送和接收)。

服务器工作得很好。问题是我尝试使用
Chrome Simple WebSocket Client
扩展连接,正如名字所说,它尝试打开
WebSocket
连接,而我的服务器处理简单的
Socket
Socket


我尝试使用
telnet
连接到服务器,效果很好(发送和接收)。

我想您希望永远使用
功能。它记录在Control.Monad中,作为网络套接字输入的常用方法。因此,您正试图使用Chrome web浏览器连接到服务器(?)在我看来,Chrome发送了一个HTTP请求,您的程序回复为
Hi(不是有效的HTTP响应),Chrome关闭网络连接,您的程序试图写入关闭的套接字时崩溃。看看如果你发送一个有效的HTTP回复会发生什么……现在我意识到chrome扩展实际上试图打开一个
websocket
,而我的haskell程序绑定了一个原始
套接字
@lsmor,他正确地执行递归调用,这相当于使用
永久
,应该可以正常工作。但是,是的,
永远
可能会更惯用。是的,WebSocket不同于原始TCP套接字。看起来WebSocket在初始握手时使用HTTP头部分,但后来允许全双工通信,有点像原始TCP。我想您想永远使用
功能。它记录在Control.Monad中,作为网络套接字输入的常用方法。因此,您正试图使用Chrome web浏览器连接到服务器(?)在我看来,Chrome发送了一个HTTP请求,您的程序回复为
Hi(不是有效的HTTP响应),Chrome关闭网络连接,您的程序试图写入关闭的套接字时崩溃。看看如果你发送一个有效的HTTP回复会发生什么……现在我意识到chrome扩展实际上试图打开一个
websocket
,而我的haskell程序绑定了一个原始
套接字
@lsmor,他正确地执行递归调用,这相当于使用
永久
,应该可以正常工作。但是,是的,
永远
可能会更惯用。是的,WebSocket不同于原始TCP套接字。看起来WebSocket在初始握手时使用HTTP头部分,但后来允许全双工通信,有点像原始TCP。