Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- clients array:
- 0 - Socket
- 1 - nickname
- 2 - active client or not (0 active , -1 disconnected)
- 3 - client ip
- """
- from socket import * # sockets
- from threading import Thread # thread
- import sys
- import os
- #store information of the clients
- clients = []
- #store clients in a private chat
- privateChat = []
- #thread that receives inputs at the server terminal
- def listClients():
- while 1:
- somethin = raw_input('see list?\n')
- #list all available connections
- if somethin == "list()":
- if len(clients) !=0:
- for i in range(0, len(clients)):
- #checks which clients are connected
- if clients[i][2]==0:
- print "name: %s ip: %s port: 12000"%(clients[i][1],clients[i][3])
- else:
- print "no such clients logged"
- elif somethin == "close()":
- for i in range(0, len(clients)):
- if clients[i][2]==0:
- try:
- clients[i][0].send("close")
- except:
- print "Logged out client"
- break
- serverSocket.close()
- os._exit(0)
- sys.exit("Finished Execution")
- #parallely manage clients
- def clientManager(connectionSocket,t_id):
- #receive the nickname of the client
- good_name = "no"
- while good_name == "no":
- sentence = connectionSocket.recv(1024)
- good_name = "yes"
- for i in range(0, len(clients)):
- if sentence == clients[i][1]:
- good_name = "no"
- connectionSocket.send("Name already in use, choose another nickname:")
- break
- clients[t_id][1] = sentence
- identification = "Cliente %s has logged in." % (sentence)
- print identification
- for i in range(0, len(clients)):
- if clients[i][2]==0:
- clients[i][0].send(identification)
- while 1:
- try:
- message = connectionSocket.recv(1024) #
- except:
- os._exit(0)
- serv_response = "[%s]: %s" % (clients[t_id][1],message)
- #store the id of who sent the message
- clientSender = t_id
- print serv_response
- #change nickname
- if "name(" in message:
- new_name = message.split('name(')
- new_name = new_name[1].split(')')
- new_name = new_name[0]
- good_name = "yes"
- for i in range(0, len(clients)):
- if new_name == clients[i][1]:
- good_name = "no"
- break
- if good_name == "no":
- clients[t_id][0].send("Name already in use, choose another nickname:")
- else:
- nick_change = "%s changed to: %s"%(clients[t_id][1],new_name)
- clients[t_id][1] = new_name
- print "New nick is: %s"%new_name
- for i in range(0, len(clients)):
- if clients[i][2]==0:
- clients[i][0].send(nick_change)
- #send list of connected users
- elif "/list" in message:
- for i in range(0, len(clients)):
- if clients[i][2]==0:
- send_list = "name: %s ip: %s port: 12000\n"%(clients[i][1],clients[i][3])
- clients[t_id][0].send(send_list)
- else:
- if message == "/quit":
- clients[t_id][2]=-1
- serv_response = "Client %s left the room."%clients[t_id][1]
- print "Client %s left the room."%clients[t_id][1]
- for i in range(0, len(clients)):
- if clients[i][2]==0 and i!= clientSender:
- clients[i][0].send(serv_response)
- break
- for i in range(0, len(clients)):
- if clients[i][2]==0 and i!= clientSender:
- clients[i][0].send(serv_response)
- connectionSocket.close()
- serverName = '' # server ip
- serverPort = 12000 # port to be connected
- global serverSocket
- serverSocket = socket(AF_INET,SOCK_STREAM) # TCP socket creation
- try:
- serverSocket.bind((serverName,serverPort)) # bind server ip with its port
- except:
- print "Port already in use"
- serverSocket.close()
- os._exit(0)
- t = Thread(target=listClients, args=())
- t.start()
- serverSocket.listen(1)
- print "TCP server waiting connections on port %d ..." % (serverPort)
- counter = 0
- while 1:
- #indicates if it was invited to a private chat
- flagInvP=0
- #inicializes who invited
- inviterID=0
- #inicializes who is in private chat
- inPrivateChat = 0
- try:
- connectionSocket, addr = serverSocket.accept()
- except:
- serverSocket.close()
- os._exit(0)
- clients.append([connectionSocket,0,0,addr,flagInvP,inviterID,inPrivateChat])
- t = Thread(target=clientManager, args=(connectionSocket,counter,))
- t.start()
- counter += 1
- serverSocket.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement