Guest User

Untitled

a guest
Jul 22nd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.63 KB | None | 0 0
  1. #-*- coding: iso-8859-2 -*-
  2. import socket, sys, os, codecs, getopt, select
  3.  
  4. def czyBledne(slowo):
  5. slowo_podpowiedzi=slowo.split(':') #podziel wiersz na slowo i podpowiedzi
  6. if len(slowo_podpowiedzi)==1: #nie ma podpowiedzi, slowo jest OK
  7. return False,slowo_podpowiedzi[0]
  8. else: #slowo bledne, ma podpowiedzi
  9. return True,slowo_podpowiedzi
  10.  
  11. #wczytywanie slownika z odpowiednim kodowaniem
  12. def wczytaj_slownik(slownik, code):
  13. try:
  14. f=open(slownik, 'r')
  15. except IOError, inst:
  16. if inst.args[0]==2: #plik nie istnieje
  17. try:
  18. f=open(slownik, 'r+')
  19. except:
  20. sys.stderr.write("Blad odczytu pliku slownika.\n")
  21. sys.exit(1)
  22. else:
  23. sys.stderr.write("Blad odczytu pliku slownika:\n"+inst.args[1]+'\n')
  24. sys.exit(1)
  25. dict={}
  26. bledne={}
  27. try:
  28. key=f.readline().strip().decode(code)
  29. except: #cos nie tak z kodowaniem
  30. sys.stderr.write("Podano zle kodowanie do odczytu pliku slownika.\n")
  31. sys.exit(1)
  32. while key:
  33. zle,slowo=czyBledne(key)
  34. if not zle:
  35. dict[slowo]=""
  36. else:
  37. bledne[slowo[0]]=slowo[1].split(',')
  38. try:
  39. key=f.readline().strip().decode(code)
  40. except:
  41. sys.stderr.write("Podano zle kodowanie do odczytu pliku slownika.\n")
  42. sys.exit(1)
  43. f.close()
  44. return dict, bledne
  45.  
  46. #dodawanie/usuwanie slowa ze slownika
  47. def dodaj(slowo, dict, bledne):
  48. if slowo[-1]==':': #usun slowo ze slownika
  49. if slowo.strip(':') in dict:
  50. del dict[slowo.strip(':')]
  51. else: #dodaj slowo
  52. zle, akt=czyBledne(slowo)
  53. if not zle:
  54. dict[akt]=""
  55. else:
  56. bledne[akt[0]]=akt[1].split(',')
  57. return dict, bledne
  58.  
  59. #funkcja do zapisania zmian do pliku slownika (uzywane przy wylaczaniu serwera)
  60. def zapisz_zmiany(slownik, code, dict, bledne):
  61. try:
  62. f=open(slownik,'w')
  63. except:
  64. sys.stderr.write("Blad podczas otwierania slownika w celu zapisu. Zmiany nie zostaly zapisane!\n")
  65. return 1
  66. for key in dict:
  67. f.write(key.encode(code)+'\n') #wyjatek niepotrzebny - jezeli kodowanie zle to wywali przy starcie.
  68. for key in bledne:
  69. key=key.strip()
  70. f.write(key.encode(code)+":")
  71. for podp in bledne[key][:-1]:
  72. podp=podp.strip().encode(code)
  73. f.write(podp+',')
  74. f.write(bledne[key][-1].encode(code)+'\n')
  75. f.close()
  76.  
  77. try:
  78. opts, args=getopt.gnu_getopt(sys.argv[1:], "hf:e:", ["help"])
  79. except getopt.error:
  80. sys.stderr.write("Blad argumentu.\n")
  81. sys.exit(1)
  82.  
  83. #ustawienie domyslnych wartosci
  84.  
  85. f=False
  86. e=False
  87. kodowanie="iso-8859-2"
  88. slownik="slownik.txt"
  89.  
  90. for opt, arg in opts:
  91. if opt in ["-h", "--help"]:
  92. print "[X] Sposob uzycia:\n serwer.py [nr_portu] [-hf:e:]"
  93. print "[X] -h, --help:\n Wyswietla ten ekran pomocy."
  94. print "[X] -f [plik]:\n Wczytuje podany plik jako slownik (domyslnie slownik.txt)"
  95. print "[X] -e [kodowanie]:\n Do wczytania slownika zostanie uzyte podane kodowanie (domyslnie iso-8859-2)"
  96. sys.exit(0)
  97. elif opt=="-f":
  98. f=True
  99. slownik=arg
  100. elif opt=="-e":
  101. e=True
  102. kodowanie=arg
  103.  
  104.  
  105. #start serwera
  106.  
  107. try:
  108. gniazdo=socket.socket()
  109. gniazdo.bind(("", int(args[0])))
  110. gniazdo.listen(5)
  111. except socket.error, inst:
  112. if inst.args[0]==13: #permission denied
  113. sys.stderr.write("Nie mozna uruchomic serwera na podanym porcie.\n")
  114. sys.exit(1)
  115. else:
  116. sys.stderr.write("Blad podczas stawiania serwera: "+inst.args[1]+"\n")
  117. sys.exit(1)
  118.  
  119. dict, bledne=wczytaj_slownik(slownik, kodowanie)
  120. print "Serwer dziala na slowniku "+slownik
  121.  
  122. readlist=[sys.stdin, gniazdo]
  123. zapytania={}
  124.  
  125. while True:
  126. read_ready,_,_=select.select(readlist,[],[])
  127. for obiekt in read_ready:
  128. if obiekt==sys.stdin: #wpisujemy cos z poziomu serwera
  129. komenda=sys.stdin.readline().strip()
  130. if komenda=="exit":
  131. zapisz_zmiany(slownik, kodowanie, dict, bledne) #zapis do pliku przed wyjsciem
  132. for obiekt in readlist:
  133. obiekt.close()
  134. sys.exit(0)
  135. elif komenda=="save": #zapisz slownik na dysku
  136. zapisz_zmiany(slownik, kodowanie, dict, bledne)
  137. else:
  138. print "Nieznana komenda."
  139. elif obiekt==gniazdo: #klient chce sie polaczyc
  140. klient,_=gniazdo.accept()
  141. readlist.append(klient)
  142. zapytania[klient]=""
  143. else: #obsluga polaczonego klienta
  144. zadanie=obiekt.recv(1024)
  145. if zadanie: #jezeli ma cos jeszcze do odebrania to dodaj do listy
  146. zapytania[obiekt]+=zadanie
  147. else:
  148. error=False #zmienna do sprawdzania czy wystapil wyjatek
  149. lista=zapytania[obiekt].split('\n')
  150. odpowiedz="ok " #co wysle serwer
  151. ile=0 #ile linii w odpowiedzi
  152. kontrolne_ile=0 #do sprawdzenia poprawnosci naglowka
  153. lista_odp=""
  154. #zczytaj naglowek i zinterpretuj
  155. try:
  156. naglowek=lista[0].split(' ')
  157. zadcode=naglowek[2] #kodowanie zadania
  158. except: #naglowek nie ma 3 skladowych
  159. error=True
  160. odpowiedz="error 0"
  161. obiekt.sendall(odpowiedz)
  162. if not error:
  163. if naglowek[0]=="check": #sprawdzanie
  164. for slowo in lista[1:]:
  165. kontrolne_ile+=1
  166. if not error:
  167. if kontrolne_ile>int(naglowek[1]): #przeslano wieksza ilosc slow niz zadeklarowano w naglowku
  168. error=True
  169. odpowiedz="error 1"
  170. obiekt.sendall(odpowiedz)
  171. else:
  172. try:
  173. slowocode=slowo.decode(zadcode) #zadanie dekodujemy do unikodu
  174. except LookupError: #nieznane kodowanie
  175. error=True
  176. odpowiedz="error 0"
  177. obiekt.sendall(odpowiedz)
  178. except UnicodeDecodeError: #zle kodowanie
  179. error=True
  180. odpowiedz="error 1"
  181. obiekt.sendall(odpowiedz)
  182. if not error:
  183. if slowocode in dict:
  184. pass
  185. elif slowocode in bledne: #czy slowo jest bledne i ma podpowiedzi?
  186. ile+=1
  187. lista_odp+=slowocode.strip()+":"
  188. for podp in bledne[slowocode]:
  189. lista_odp+=podp.strip()+","
  190. lista_odp=lista_odp.strip(',') #kasujemy niepotrzebny przecinek
  191. lista_odp+='\n'
  192. else: #slowo bledne, bez podpowiedzi
  193. ile+=1
  194. lista_odp+=slowocode.strip()+'\n'
  195. #skladanie odpowiedzi
  196. if not error:
  197. if kontrolne_ile<int(naglowek[1]): #przeslano mniej wyrazow niz zadeklarowano
  198. odpowiedz="error 1"
  199. obiekt.sendall(odpowiedz)
  200. else:
  201. odpowiedz+=str(ile)+'\n'
  202. odpowiedz+=lista_odp
  203. odpowiedz=odpowiedz.strip()
  204. try: #zle kodowanie
  205. odpowiedz=odpowiedz.encode(zadcode)
  206. except:
  207. odpowiedz="error 1"
  208. obiekt.sendall(odpowiedz) #odsylamy zadanie
  209. elif naglowek[0]=="add": #dodawanie
  210. for slowo in lista[1:]:
  211. kontrolne_ile+=1
  212. if kontrolne_ile>int(naglowek[1]): #przeslano wieksza ilosc slow niz zadeklarowano w naglowku
  213. error=True
  214. odpowiedz="error 1"
  215. obiekt.sendall(odpowiedz)
  216. else:
  217. try:
  218. slowocode=slowo.decode(zadcode)
  219. except LookupError: #nieznane kodowanie
  220. error=True
  221. odpowiedz="error 0"
  222. obiekt.sendall(odpowiedz)
  223. except UnicodeDecodeError: #zle kodowanie
  224. error=True
  225. odpowiedz="error 1"
  226. obiekt.sendall(odpowiedz)
  227. if not error:
  228. if slowocode in dict: #slowo w slowniku - pomijamy dodawanie
  229. pass
  230. else: #dodaj do slownika
  231. dict,bledne=dodaj(slowocode, dict, bledne)
  232. if not error:
  233. if kontrolne_ile<int(naglowek[1]): #przeslano mniej wyrazow niz zadeklarowano
  234. odpowiedz="error 1"
  235. obiekt.sendall(odpowiedz)
  236. else:
  237. odpowiedz+=str(ile)+'\n'
  238. try:
  239. odpowiedz=odpowiedz.encode(zadcode)
  240. except:
  241. odpowiedz="error 1"
  242. obiekt.sendall(odpowiedz)
  243. else: #nieprawidlowe polecenie
  244. odpowiedz="error 0"
  245. obiekt.sendall(odpowiedz)
  246. del zapytania[obiekt]
  247. readlist.remove(obiekt)
  248. obiekt.close()
Add Comment
Please, Sign In to add comment