Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.52 KB | None | 0 0
  1. # socket_echo_client.py
  2. import socket
  3. import sys
  4. import threading
  5. import datetime as dt
  6. import time
  7. import os
  8. import select
  9.  
  10. connect_sockets = {}
  11. socket_to_server = None
  12.  
  13.  
  14.  
  15. """
  16. socket_to_server => Socket for the connection to the server
  17. p2p_server => Server object for p2p connections
  18. peer_list => List of p2p clients connected to OUR p2p server
  19.  
  20. """
  21.  
  22. # a class structure that holds information regarding the client thread
  23. class ThreadManager():
  24. def __init__(self, server_socket):
  25. self.socket_to_server = server_socket
  26. self.p2p_server = None
  27. self.peers = {}
  28. self.peers_reverse_map = {}
  29. self.awaiting_connections = []
  30.  
  31. # thread to listen and handle sending
  32. def send_thread(self):
  33. while True:
  34. try:
  35. data = input("")
  36. except KeyboardInterrupt:
  37. sock.close()
  38. sys.exit(1)
  39. return
  40. if (data == ""):
  41. continue
  42.  
  43. if (data.startswith("private ")):
  44.  
  45. if (len(data.split()) < 2):
  46. print(">Please enter [startprivate] [message]... [message]")
  47. continue
  48. result = data.split(" ", 2)
  49. receiver_name = result[1]
  50. if (receiver_name not in self.peers):
  51. print("Error. Private messaging to " + receiver_name + " not enabled")
  52. else:
  53. sock = self.peers[receiver_name]
  54. print("DELETE this print later " + data)
  55. message = "(private): " + result[2]
  56. sock.send(message.encode())
  57. time.sleep(0.05)
  58. continue
  59. elif (data.startswith("stopprivate ")):
  60. result = data.split()
  61. if (len(result) > 2):
  62. sock.send(">Error. Please enter only 1 user to stop private message")
  63. elif (len(resul) == 1):
  64. sock.send(">Error. Please enter [stopprivate] [username]")
  65. elif (len(result) == 2):
  66. if (result[1] not in self.peers):
  67. sock.send("Error. There does not exist an active private messaging session with " + result[1])
  68. else:
  69. receiver_name = str(self.result[1])
  70. print("Stop private messaging with " + result[1])
  71. del self.peers_reverse_map[self.user[receiver_name]]
  72. del self.user[receiver_name]
  73. message = "stopprivate " + str(p2p_server)
  74. sock.send(message.encode())
  75. # handling and starting private connections
  76. else:
  77. if data.startswith("startprivate "):
  78. if (len(data.split()) != 2):
  79. print(">Please enter [startprivate] [username]")
  80. continue
  81. elif (data.split()[1] in self.peers):
  82. print(">Private connection to " + data.split()[1] + " is still here")
  83. continue
  84. # appending receiver name
  85. self.awaiting_connections.append(data.split(" ")[1])
  86.  
  87. #send command to Server
  88. self.socket_to_server.send(data.encode())
  89. time.sleep(0.05)
  90. continue
  91.  
  92. self.socket_to_server.close()
  93. return
  94.  
  95. #thread for receiving messages from server and p2p
  96. def receive_thread(self):
  97. while True:
  98. readList = [self.socket_to_server] + list(self.peers.values())
  99. #print(readList)
  100. if self.p2p_server is not None:
  101. readList.append(self.p2p_server)
  102. try:
  103. readable, write, execute = select.select(readList, [], [], 1)
  104. except(ConnectionResetError, OSError, SystemError, ValueError):
  105. print(">Oh no! Something is not right. Stopping program.")
  106. return
  107.  
  108.  
  109. for sock in readable:
  110.  
  111. if (sock == self.socket_to_server):
  112. try:
  113. data = sock.recv(2048).decode()
  114. if (data == ""):
  115. continue
  116. print(data)
  117. except ConnectionResetError:
  118. print('caught error')
  119. return
  120. except KeyboardInterrupt:
  121. sock.close()
  122. sys.exit(1)
  123. return
  124.  
  125. if (data == "logout" ):
  126. sock.close()
  127. os._exit(1)
  128. #send to receiver
  129. elif (data == "start p2p"):
  130. print(">Receiver receiving P2P request")
  131. self.start_p2p()
  132. #send to receiver, who will establish the connection
  133. elif (data.startswith("connect p2p initiator")):
  134. self.connect_to_initiator_p2p(data.split())
  135.  
  136. continue
  137. # whe you are receiveing as a p2p server
  138. elif sock is self.p2p_server:
  139. if len(self.awaiting_connections) == 0:
  140. continue
  141. newp2pconnection, addr = sock.accept()
  142. # i am the receiver here
  143. receiver_name = self.awaiting_connections.pop(0)
  144.  
  145. self.peers[receiver_name] = newp2pconnection
  146. self.peers[str(newp2pconnection)] = receiver_name
  147.  
  148.  
  149. #handles private receiving
  150. try:
  151. data = sock.recv(2048).decode()
  152. if (data == ""):
  153. continue
  154. print(data)
  155. except ConnectionResetError:
  156. print('caught error')
  157. return
  158. except KeyboardInterrupt:
  159. sock.close()
  160. sys.exit(1)
  161. return
  162. result = data.split()
  163. if (sock is self.p2p_server):
  164. print(">Error. Cannot peer-connect to self")
  165. return
  166. # no validity checker is required
  167. elif (result[0] == "(private):" ):
  168. temp = str(sock)
  169. sender_name = self.peers_reverse_map[temp]
  170. #send to server
  171. print("> " + sender_name + result)
  172. elif (data.startswith("stopprivate")):
  173. result = data.split()
  174. sender_sock = str(self.result[1])
  175. print(result[1] + ": Stop private messaging with " + result[1])
  176. del self.peers_reverse_map[sender_sock]
  177. del self.user[self.peers_reverse_map[sender_sock]]
  178.  
  179. elif (data != ""):
  180. print(data)
  181. continue
  182.  
  183. sock.close()
  184. os._exit(1)
  185. return
  186.  
  187.  
  188. #Server send initiator data to receiver
  189. def connect_to_initiator_p2p(self, result):
  190. time.sleep(1)
  191. #initiator's name
  192. sender_name = result[3]
  193. #sock is the client socket
  194. receiver_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  195. receiver_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  196. #host = 'localhost'
  197. #port_str = result[4]
  198.  
  199. host, port = result[4].split("|")
  200. port = int(port)
  201. initiator_addr = (host, port)
  202.  
  203. try:
  204. receiver_sock.connect(initiator_addr)
  205. except ConnectionRefusedError:
  206. print(">P2P connection failed from " + sender_name )
  207. #sys.exit()
  208. # a list of connected socket
  209. #receivers side
  210. self.peers[sender_name] = receiver_sock
  211. temp = str(receiver_sock)
  212. self.peers_reverse_map[temp] = sender_name
  213. '''
  214. try:
  215. receiver_sock.send(sender_name.encode())
  216. except BrokenPipeError:
  217. print(">BrokenPipeError. Fail to connect from " + sender_name)
  218. '''
  219. message = "succeed"
  220. self.socket_to_server.send(message.encode())
  221. print(">Start private messaging")
  222. #p2p is now set up
  223. return sender_name
  224.  
  225. # initiator start listening
  226. def start_p2p(self):
  227. if self.p2p_server is not None:
  228. return
  229. print(">Establishing P2P connection")
  230.  
  231. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  232. port = self.socket_to_server.getsockname()[1]
  233. #my_peer_address = ('localhost', port)
  234. my_peer_address = ('0.0.0.0', port)
  235.  
  236. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  237.  
  238. # Bind the socket to the port
  239. server.bind(my_peer_address)
  240.  
  241. # Listen for incoming connections
  242. server.listen(1)
  243. self.p2p_server = server
  244. #self.socket_to_server.send(str(server.getsockname()[1]).encode())
  245.  
  246.  
  247. def tupleToDelimString(tup):
  248. return "|".join([str(item) for item in tup])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement