chat.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #! /usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. This file is part of librelight.
  5. librelight is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, version 2 of the License.
  8. librelight is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with librelight. If not, see <http://www.gnu.org/licenses/>.
  14. (c) 2012 micha@librelight.de
  15. """
  16. import socket
  17. import sys
  18. import time
  19. class tcp_sender(object):
  20. def __init__(self,port=50000):
  21. self.port = port
  22. self.connect()
  23. def connect(self,client_name="unkown"):
  24. self.xip = "127.0.0.1" #raw_input("IP-Adresse: ")
  25. self.xs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  26. print("port:",self.port)
  27. try:
  28. self.xs.connect((self.xip, self.port)) #50000))
  29. except ConnectionRefusedError as e:
  30. print("ConnectionRefusedError: ", "ERR: {0} ".format(e.args) ,end="")
  31. print("Server nicht ereichbar/unterbrochen")
  32. time.sleep(1)
  33. self.connect()
  34. print("connected !")
  35. def send(self,nachricht):
  36. try:
  37. #self.xs.send(bytes(nachricht+";","utf-8") )
  38. self.xs.send(nachricht.encode("utf-8")+b";" )
  39. except socket.error as e:
  40. self.connect()
  41. def close(self):
  42. self.xs.close()
  43. def dummyCB(msg):
  44. print("dummy_CB",msg)
  45. def cmd(cb=dummyCB,port=50000):
  46. x=CMD(cb=cb,port=port)
  47. while 1:
  48. x.poll()
  49. import socket
  50. import select
  51. class CMD():
  52. def __init__(self,cb=dummyCB,port=50000):
  53. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  54. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  55. #self.xs.getsockopt(socket.AF_INET, socket.SO_REUSEADDR )
  56. while 1:
  57. print("bind port:",port)
  58. try:
  59. server.bind(("", port))
  60. break
  61. except Exception as e:
  62. print("except",e)
  63. print( "bind error")
  64. time.sleep(1)
  65. server.listen(1)
  66. clients = []
  67. clients2 = [""]*300
  68. self.server = server
  69. self.clients = clients
  70. self.clients2 = clients2
  71. self.cb=cb
  72. self.select=select
  73. self.msg=b''
  74. def poll(self):
  75. server = self.server
  76. clients = self.clients
  77. clients2 = self.clients2
  78. cb=self.cb
  79. select=self.select
  80. try:
  81. #if 1: #
  82. while True:
  83. try:
  84. lesen, schreiben, oob = select.select([server] + clients,
  85. [], [])
  86. except:
  87. return 0
  88. for sock in lesen:
  89. if sock is server:
  90. client, addr = server.accept()
  91. client.setblocking(0)
  92. clients.append(client)
  93. print("+++ Client %s verbunden" % addr[0])
  94. #sock.send("hi du")
  95. else:
  96. msg=b''
  97. try:
  98. if self.msg:
  99. xmsg = self.msg
  100. else:
  101. xmsg = sock.recv(1)#1024)#5120)
  102. while xmsg:# != b"\x00":
  103. if b'\x00' in xmsg:
  104. s = xmsg.split(b"\x00",1)
  105. msg += s[0]
  106. self.msg = s[1]
  107. break
  108. msg += xmsg
  109. xmsg = sock.recv(1)#5120)
  110. #xmsg = xmsg.replace(b";",b"")
  111. #print(msg)
  112. except BlockingIOError as e:
  113. pass#print( "exception",e)
  114. if not msg:
  115. continue
  116. nachricht = msg
  117. #print(msg)
  118. #nachricht = str(nachricht,"utf-8")
  119. nachricht = nachricht.replace(b";",b"")
  120. nachrichten = nachricht.strip().replace(b"EOB",b"")
  121. if b"client_name:" in nachrichten:
  122. if sock in clients:
  123. client_nr = clients.index(sock)
  124. clients2[client_nr] = nachrichten
  125. if sock in clients:
  126. client_nr = clients.index(sock)
  127. #print(clients2[client_nr])
  128. ip = sock.getpeername()[0]
  129. #print(">>>", ip, nachrichten.split(";"))
  130. if nachrichten:
  131. tstamp = time.strftime("%H:%M:%S")
  132. #print("from:",client_nr,">>>", tstamp , ip, nachrichten.split(";"))
  133. for xx,nachricht in enumerate(nachrichten.split(b";")):
  134. cmd = nachricht #.split(" ")
  135. #print(xx,cmd)
  136. cb({"c":client_nr,"cmd":cmd})
  137. else:
  138. time.sleep(0.0001)
  139. #else: #workaround json sock pkg-drops
  140. # print("+++ Verbindung zu %s beendet" % ip)
  141. # sock.close()
  142. # if sock in clients:
  143. # client_nr = clients.index(sock)
  144. # clients2[client_nr] = ""
  145. # clients.remove(sock)
  146. except KeyboardInterrupt:
  147. print(" strg+c")
  148. finally:
  149. for c in clients:
  150. print(c,"close")
  151. c.close()
  152. server.close()
  153. print("server close")
  154. if __name__ == "__main__":
  155. print( sys.argv )
  156. if sys.argv[1] == "server":
  157. cmd()
  158. elif sys.argv[1] == "client":
  159. c = tcp_sender()
  160. while 1:
  161. x = input(":: ")
  162. c.send(x)