使用Haskell编写一个TCP服务器
发布时间:2023-12-10 11:39:19
下面是一个使用Haskell编写的TCP服务器的例子:
import Network.Socket
main :: IO ()
main = withSocketsDo $ do
-- 创建socket
sock <- socket AF_INET Stream 0
-- 设置socket地址可以被复用
setSocketOption sock ReuseAddr 1
-- 绑定socket到指定的地址和端口
bind sock (SockAddrInet 8080 iNADDR_ANY)
-- 监听socket,最大允许的连接数为5
listen sock 5
putStrLn "Waiting for connections..."
-- 进入主循环,不断接受新连接
loop sock
loop :: Socket -> IO ()
loop sock = do
-- 接受新连接
(conn, addr) <- accept sock
putStrLn $ "Accepted connection from " ++ show addr
-- 在新线程中处理接收到的请求
forkIO $ do
handler conn
-- 关闭连接
close conn
putStrLn "Connection closed"
-- 继续等待新连接
loop sock
handler :: Socket -> IO ()
handler conn = do
-- 从连接中读取数据
msg <- recv conn 4096
putStrLn $ "Received message: " ++ show msg
-- 向连接写入响应数据
sendAll conn "Hello from Haskell!"
这个例子实现了一个简单的TCP服务器,它监听本地的8080端口,并在接收到连接时向连接发送欢迎消息。它使用了网络库Network.Socket提供的函数来创建、绑定、监听和处理连接。
在main函数中,我们首先创建一个socket,设置socket选项并绑定到指定的地址和端口。然后,我们进入一个无限循环,调用loop函数来接受新连接。loop函数会在新线程中处理每个接受到的连接。在handler函数中,我们从连接中读取数据并打印出来,然后向连接发送响应消息。
要使用该服务器,您可以将上述代码保存为一个文件(例如Server.hs),然后使用ghc编译器编译它:
ghc Server.hs
编译成功后,运行生成的可执行文件即可启动服务器:
./Server
您现在可以使用Telnet或其他TCP客户端连接到服务器的8080端口,然后输入一些消息,应该会收到服务器的回复。
这个例子只是一个简单的示例,实际的服务器可能需要更多的功能和错误处理。但希望这个例子能够帮助您入门使用Haskell编写TCP服务器。
