欢迎访问宙启技术站
智能推送

使用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服务器。