Witam!
Postanowiłem napisać skrypt, prosty czat sieciowy. Serwer się kompiluje, klient również, tylko jest jeden problem. Mianowicie : gdy serwer otrzymuje połączenie wyrzuca błąd "Broken Pipe". Nie mam pojęcia, o co chodzi, bardzo byłbym wdzięczny za wszelką pomoc. Poniżej listingi:
Kod błędu:
Traceback (most recent call last):
File "serwer.py", line 22, in <module>
czat.interpretuj(wiadomosc, addr)
File "/home/mateusz/Desktop/Python/Czat/CCzat.py", line 31, in interpretuj
self.wylogowanie(adres)
File "/home/mateusz/Desktop/Python/Czat/CCzat.py", line 70, in wylogowanie
socket.sendto("3", adres_ip)
socket.error: [Errno 32] Broken pipe
Plik: serwer.py
#!/usr/bin/env python
from CCzat import *
from socket import *
import time
#Komunikat powitalny
print "MiniCzat - Serwer."
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', 7987))
s.listen(5)
czat = CCZat(s)
while 1:
client, addr = s.accept()
wiadomosc = client.recv(1024)
print "Polaczenie przychodzace z ", addr[0]
print "Wiadomosc: " + wiadomosc
czat.interpretuj(wiadomosc, addr)
client.close()
s.close()
Plik: CCZat.py
#!/usr/bin/env python
from socket import *
import time
class CCZat:
#Lista klientow podlaczonych do serwera
adresy = []
#Klient - adres ip slownik
adr_nick = {}
def __init__(self, socket2):
global socket
socket = socket2
def interpretuj(self, komenda, adres):
#Kody komend
#0 - wiadomosc
#1 - logowanie
#2 - wylogowanie
#3 - blad
#4 - logowanie pomyslne
#5 - wylogowanie pomyslne
if komenda[1] == "0":
self.wiadomosc(komenda[1:len(komenda)-1], adres)
else:
if komenda[1] == "1":
self.logowanie(komenda[1:len(komenda)-1], adres)
else:
self.wylogowanie(adres)
def wiadomosc(self, tekst, adres_ip):
nadawca = adr_nick[adres_ip]
for i in adresy:
socket.sendto("0[" + nadawca + "]" + tekst, i)
def logowanie(self,nick, adres):
try:
if adr_nick.has_key(adres):
raise Exception, "Uzytkownik jest juz polaczony z serwerem !"
def sprawdz(adr):
if adr_nick[adr] == nick:
raise Exception, "Uzytkownik o nicku " + nick + " juz jest polaczony z tym serwerem. Prosze wybrac inny nick!"
map(sprawdz, adr_nick)
except Exception, e:
socket.sendto("3", adres)
else:
adresy.append(adres)
adr_nick[adres] = nick
socket.sendto("4", adres)
def wylogowanie(self,adres_ip):
try:
if adresy.count(adres_ip) == 1:
adresy.remove(adres_ip)
else:
raise blad, "Nie mozna wylogowac, klient nie istnieje!"
if adr_nick.has_key(adres_ip):
del adr_nick[adres_ip]
else:
raise blad, "Nie mozna wylogowac, klient nie istnieje!"
except:
socket.sendto("3", adres_ip)
else:
socket.sendto("5", adres_ip)
Plik: klient.py
#!/usr/bin/env python
from socket import *
print "MINICZAT"
#czy uzytkownik zalogowal sie poprawnie ?
logowanie = 0
ip_serwer = raw_input("Podaj ip serwera: ")
s = socket()
s.connect((ip_serwer, 7987))
while logowanie != 1:
nick = raw_input("Podaj swoj nick: ")
s.send("1"+nick)
odpowiedz = s.recv(1024)
if odpowiedz == "4":
logowanie = 1
else:
print "Serwer zwrocil blad: " + odpowiedz[1:len(odpowiedz)-1]
Z góry dziękuję za każdą pomoc !