diff --git a/virtualsnack.py b/virtualsnack.py index 0f7683f6c1378aa99746b54ea6087ef26cb109b9..87cdf12e9a97327b90c07b6f8ff0742b4739dd83 100755 --- a/virtualsnack.py +++ b/virtualsnack.py @@ -2,6 +2,11 @@ import npyscreen from datetime import datetime +# Incorporates code +# from http://www.binarytides.com/python-socket-server-code-example/ +# Socket server in python using select function +import socket, select + class ContainedMultiSelect(npyscreen.BoxTitle): _contained_widget = npyscreen.TitleMultiSelect @@ -9,8 +14,11 @@ class VirtualSnack(npyscreen.Form): def while_waiting(self): self.date_widget.value = datetime.now().ctime() + self.sentfield.value = self.parentApp.sent + self.receivedfield.value = self.parentApp.received self.display() + def create(self, *args, **keywords): super(VirtualSnack, self).create(*args, **keywords) @@ -48,6 +56,9 @@ class VirtualSnack(npyscreen.Form): self.date_widget = self.add(npyscreen.FixedText, value=datetime.now().ctime(), editable=False) self.date_widget.value = "Hello" self.add_handlers({"^T": self.exit_application}) + + self.sentfield = self.add(npyscreen.TitleText, name = "Sent:", value="", editable=False ) + self.receivedfield = self.add(npyscreen.TitleText, name = "Received:", value="", editable=False ) def exit_application(self,name): self.parentApp.setNextForm(None) @@ -55,11 +66,66 @@ class VirtualSnack(npyscreen.Form): class VirtualSnackApp(npyscreen.NPSAppManaged): - keypress_timeout_default = 2 + keypress_timeout_default = 1 def onStart(self): self.addForm("MAIN", VirtualSnack, name="Virtual Snack") + + # socket code + self.CONNECTION_LIST = [] # list of socket clients + self.RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2 + PORT = 5000 + + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # this has no effect, why ? + self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.server_socket.bind(("0.0.0.0", PORT)) + self.server_socket.listen(10) + + # Add server socket to the list of readable connections + self.CONNECTION_LIST.append(self.server_socket) + + self.sent="" + self.received="Chat server started on port " + str(PORT) + def while_waiting(self): + # Get the list sockets which are ready to be read through select + read_sockets,write_sockets,error_sockets = select.select(self.CONNECTION_LIST,[],[],0.01) + + for sock in read_sockets: + + #New connection + if sock == self.server_socket: + # Handle the case in which there is a new connection recieved through self.server_socket + sockfd, addr = self.server_socket.accept() + self.CONNECTION_LIST.append(sockfd) + self.received = "Client (%s, %s) connected" % 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(self.RECV_BUFFER) + # echo back the client message + if data: + response = 'OK ... ' + data + sock.send(response) + self.sent = response + self.received = data + + + # client disconnected, so remove from socket list + except: + #print "Client (%s, %s) is offline" % addr + sock.close() + self.CONNECTION_LIST.remove(sock) + continue + + + def onCleanExit(self): + self.server_socket.close() if __name__ == "__main__": App = VirtualSnackApp()