Python 最小聊天服务器&&客户端

来源:互联网 发布:lego ev3 编程 编辑:程序博客网 时间:2024/06/01 14:36

转载自

http://www.binarytides.com/code-chat-application-server-client-sockets-python/

import socket, selectdef broadcast_data(sock, message):    for socket in CONNECTION_LIST:        if socket != server_socket and socket != sock:            try:                socket.send(message)            except:                socket.close()                CONNECTION_LIST.remove(socket)if __name__ == "__main__":    CONNECTION_LIST = []    RECV_BUFFER = 4096    PORT = 5000    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    server_socket.bind(("0.0.0.0", PORT))    server_socket.listen(10)    CONNECTION_LIST.append(server_socket)    print "Chat server started on port " + str(PORT)    while True:        read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST, [], [])        for sock in read_sockets:            if sock == server_socket:                sockfd, addr = server_socket.accept()                CONNECTION_LIST.append(sockfd)                print "Client (%s, %s) connected" % addr                broadcast_data(sockfd, "[%s:%s] entered room\n" % addr)            else:                try:                    data = sock.recv(RECV_BUFFER)                    if data:                        broadcast_data(sock, "\r" + '<' + str(sock.getpeername()) + '> ' + data)                except:                    broadcast_data(sock, "Client (%s, %s) is offline" % addr)                    print "Client (%s, %s) is offline" % addr                    sock.close()                    CONNECTION_LIST.remove(sock)                    continue    server_socket.close()

python Server.py

import socket, select, string, sysdef prompt():    sys.stdout.write('<You> ')    sys.stdout.flush()if __name__ == "__main__":    if len(sys.argv) < 3:        print 'Usage : python ChatClient.py hostname port'        sys.exit()    host = sys.argv[1]    port = int(sys.argv[2])    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    s.settimeout(2)    try:        s.connect((host, port))    except:        print 'Unable to connect'        sys.exit()    print 'Connected to remote host. Start sending messages'    prompt()    while True:        rlist = [sys.stdin, s]        read_list, write_list, error_list = select.select(rlist, [], [])        for sock in read_list:            if sock == s:                data = sock.recv(4096)                if not data:                    print '\nDisconnected from chat server'                    sys.exit()                else:                    sys.stdout.write(data)                    prompt()            else:                msg = sys.stdin.readline()                s.send(msg)                prompt()

python EchoClient.py localhost 5000
python EchoClient.py localhost 5000