新问题:haskell Network.Socket 监听TCP 如何持续接收数据?
新问题在三楼
看了一下 Network 和 Network.Socket
如果用Network 里面的ListenOn 可以监听TCP 端口.
用Network.Socket 不知道如何监听TCP 端口 .
监听UDP端口的实例如下:
import Network.Socket import IO main = withSocketsDo $ do |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
8楼的代码是可以编译的. 可以测试一下.
运行server.exe, 监听端口30000
client_1 : nc -vv 127.0.0.1 30000
client_2 : nc -vv 127.0.0.1 30000
两个连接建立成功.
client_1 给server发送数据
client_2 给server发送数据
server 返回的结果, 处理(显示)完client_1的数据, 再处理(显示)client_2的数据.
还是程序写的有问题?
> 处理完一个client发的数据,再处理下一个client发的数据.
不是这样的,是并发的。
putStrLn "Start Server!"
mainserver
mainserver = withSocketsDo $ do
sock <- socket AF_INET Stream 6
bindSocket sock (SockAddrInet 30000 iNADDR_ANY)
listen sock 10
putStrLn "Server Listening port 30000 ..."
loopserver sock
loopserver sock = do
(s,c) <- accept sock
forkIO $ clientloop s c
loopserver sock
clientloop s c = do
msg <- recvFrom s 1024
print msg
sendTo s "I'm Servern" c
clientloop s c
loopserver sock = do
(s,c) <- accept sock
forkIO $ perClientLoop s
loopserver sock
perClientLoop s = do
msg <- recvFrom s 1024
print msg
send msg "I'm Server"
perClientLoop s
看了一下,Network.Socket 这套接口太底层了,还是用 Network 吧。
Network.Socket 里的接口:
listen :: Socket -> Int -> IO ()
Network 里的接口:
listenOn
:: PortID Port Identifier
-> IO Socket Connected Socket
给你一个简单例子,server把收到的内容原样发给client
复制代码
这一步过去,下一步就可以做数据处理了, 结果又K啦.
import Network.Socket
import IO
main = do
putStrLn "Server start ... "
mainserver
mainserver = withSocketsDo $ do
s <- socket AF_INET Stream 6
s_addr <- inet_addr "127.0.0.1"
bindSocket s (SockAddrInet 30000 s_addr)
putStrLn $ "Listening port 30000 ......"
listen s 10
loopserver s
loopserver sock = do
(s,c) <- accept sock
msg <- recvFrom s 1024
print msg
send msg "I'm Server"
loopserver sock
tcp难道不需要listen吗? 还有accept
可参考一下http://book.realworldhaskell.org/read/sockets-and-syslog.html