Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Create a Python-based Internet chat application with a server program and a clie

ID: 3810977 • Letter: C

Question

Create a Python-based Internet chat application with a server program and a client program. The server manages a chat group, allowing any number of clients to join the group with a user name at any time.

(1) Broadcast: Any client is able to send a text to the server, which will relay it to all other clients for display.

(2) Broadcast: Any client is able to send a file of any type to the group via the server.

(3) Unicast: Any client is able to send a private message to a specific other client via the server.

(4) Unicast: Any client is able to send a private file of any type to a specific other client via the server.

(5) Blockcast: Any client is able to send a text to all other clients except for one via the sever.

Explanation / Answer

Server code

# Tcp Chat server

import socket, select

#Function to broadcast chat messages to all connected clients

def broadcast_data (sock, message):

    #Do not send the message to master socket and the client who has send us the message

    for socket in CONNECTION_LIST:

        if socket != server_socket and socket != sock :

            try :

                socket.send(message)

            except :

                # broken socket connection may be, chat client pressed ctrl+c for example

                socket.close()

                CONNECTION_LIST.remove(socket)

if __name__ == "__main__":

     

    # List to keep track of socket descriptors

    CONNECTION_LIST = []

    RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2

    PORT = 5000

     

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # this has no effect, why ?

    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    server_socket.bind(("0.0.0.0", PORT))

    server_socket.listen(10)

    # Add server socket to the list of readable connections

    CONNECTION_LIST.append(server_socket)

    print "Chat server started on port " + str(PORT)

    while 1:

        # Get the list sockets which are ready to be read through select

        read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])

        for sock in read_sockets:

            #New connection

            if sock == server_socket:

# Handle the case in which there is a new connection recieved through server_socket

                sockfd, addr = server_socket.accept()

                CONNECTION_LIST.append(sockfd)

                print "Client (%s, %s) connected" % addr

                 

                broadcast_data(sockfd, "[%s:%s] entered room " % addr)

             

            #Some incoming message from a client

            else:

                # Data recieved from client, process it

                try:

                    #In Windows, sometimes when a TCP program closes abruptly,

                    # a "Connection reset by peer" exception will be thrown

                    data = sock.recv(RECV_BUFFER)

                    if data:

                        broadcast_data(sock, " " + '<' + 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()

Client code

# telnet program example

import socket, select, string, sys

def prompt() :

    sys.stdout.write('<You> ')

    sys.stdout.flush()

#main function

if __name__ == "__main__":

     

    if(len(sys.argv) < 3) :

        print 'Usage : python telnet.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)

     

    # connect to remote host

    try :

        s.connect((host, port))

    except :

        print 'Unable to connect'

        sys.exit()

     

    print 'Connected to remote host. Start sending messages'

    prompt()

     

    while 1:

        socket_list = [sys.stdin, s]

         

        # Get the list sockets which are readable

        read_sockets, write_sockets, error_sockets

= select.select(socket_list , [], [])

         

        for sock in read_sockets:

            #incoming message from remote server

            if sock == s:

                data = sock.recv(4096)

                if not data :

                    print ' Disconnected from chat server'

                    sys.exit()

                else :

                    #print data

                    sys.stdout.write(data)

                    prompt()

             

            #user entered a message

            else :

                msg = sys.stdin.readline()

                s.send(msg)

                prompt()