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

使用Python和Haskell构建的多线程网络应用案例

发布时间:2023-12-09 06:05:45

使用Python构建多线程网络应用的案例:

案例:使用多线程实现简单的聊天室

import socket
import threading

class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.clients = []

    def handle_client(self, client_socket):
        while True:
            try:
                # 接收客户端发送的消息
                message = client_socket.recv(1024).decode('utf-8')
                # 广播消息给其他客户端
                self.broadcast(message)
            except:
                # 发生异常时,关闭客户端连接
                self.clients.remove(client_socket)
                client_socket.close()
                break

    def broadcast(self, message):
        for client in self.clients:
            try:
                # 发送消息给客户端
                client.send(message.encode('utf-8'))
            except:
                # 发送失败时,关闭客户端连接
                client.close()
                self.clients.remove(client)

    def start(self):
        self.server_socket.bind((self.host, self.port))
        self.server_socket.listen(5)
        print('Server started on {}:{}'.format(self.host, self.port))
        
        while True:
            client_socket, addr = self.server_socket.accept()
            print('New connection from {}'.format(addr))
            
            # 启动一个新线程来处理客户端连接
            client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))
            client_thread.start()
            
            # 保存客户端连接
            self.clients.append(client_socket)

if __name__ == '__main__':
    server = Server('localhost', 8000)
    server.start()

使用Haskell构建多线程网络应用的案例:

案例:使用多线程实现简单的Echo服务器

import Network.Socket
import Control.Concurrent

main :: IO ()
main = withSocketsDo $ do
    -- 创建 TCP Socket
    sock <- socket AF_INET Stream defaultProtocol
    
    -- 绑定 IP 地址和端口号
    bind sock (SockAddrInet 8000 iNADDR_ANY)
    
    -- 监听连接请求
    listen sock 5
    
    -- 等待客户端连接并处理
    loop sock
    where 
        loop sock = do
            (clientSock, clientAddr) <- accept sock
            putStrLn $ "New connection from " ++ show clientAddr
            
            -- 启动一个新线程来处理客户端连接
            forkIO $ handleClient clientSock
            
            -- 继续等待新的客户端连接
            loop sock
        
        handleClient clientSock = do
            -- 接收客户端发送的消息
            message <- recv clientSock 1024
            
            -- 发送消息给客户端
            send clientSock message
            
            -- 关闭客户端连接
            close clientSock

以上是一个使用Python和Haskell构建的多线程网络应用案例,分别实现了简单的聊天室和Echo服务器。这两个案例都使用了多线程来处理客户端连接,可以同时处理多个客户端请求。在Python案例中,使用了socket模块和threading模块来实现多线程网络应用;在Haskell案例中,使用了network库和Concurrent库来实现多线程网络应用。无论是Python还是Haskell,都可以很方便地使用多线程来构建网络应用,提高处理并发请求的效率。