Форум сайта python.su
В общем написал сервак:
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
users_ids=[]
clients = []
def handle(self):
user_id=self.request.recv(1024).strip()
already_logged_in = False
for i in range(len(self.users_ids)):
if(self.users_ids[i] == user_id):
already_logged_in = True
break
if not already_logged_in:
print "client: %s connected as " % self.client_address[0] + user_id
self.users_ids.append(user_id)
self.clients.append(self.request)
response = "connected"
else:
response = "already logged in"
self.request.send(response)
for i in range(len(self.clients)):
if(self.clients[i] != self.request):
self.clients[i].send("new user connected")
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
import socket
import sys
import time
HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.send(data)
while 1:
time.sleep(0.03)
received = sock.recv(1024)
if(received != ""):
print "Received: %s" % received
Exception happened during processing of request from ('127.0.0.1', 2851)
Traceback (most recent call last):
File “C:\Python27\lib\SocketServer.py”, line 284, in _handle_request_noblock
self.process_request(request, client_address)
File “C:\Python27\lib\SocketServer.py”, line 310, in process_request
self.finish_request(request, client_address)
File “C:\Python27\lib\SocketServer.py”, line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File “C:\Python27\lib\SocketServer.py”, line 639, in __init__
self.handle()
File “C:\Python27\tcp server\server.py”, line 24, in handle
self.clients.send(“new user connected”)
File “C:\Python27\lib\socket.py”, line 170, in _dummy
raise error(EBADF, ‘Bad file descriptor’)
error: Bad file descriptor
—————————————-
Офлайн
Догадайтесь с трех раз: что происходит с сервером, когда клиент закрывается?
Офлайн
while 1:
time.sleep(0.03)
received = sock.recv(1024)
if(received != ""):
print "Received: %s" % received
Офлайн
вместо этого:
already_logged_in = False
for i in range(len(self.users_ids)):
if(self.users_ids[i] == user_id):
already_logged_in = True
break
already_logged_in = user_id in self.users_ids
Офлайн
o7412369815963, спасибо за подсказку.
Но может мне все же скажет кто ни будь, как же оставить соединение открытым?
Офлайн
Предположение неверное, сервер сокет сам не закрывает.
Еще раз:
запустили сервер
запустили клиент
закрыли клиент
запустили клиент - и все поломалось.
Почему?
Офлайн
Андрей Светлов, а где клиент, в моем коде, закрывается?
Я вижу картину так:
запустили сервер
запустили клиент
запустили второй клиент
сервер пытается уведомить об этом первого - и все поломалось.
Вот я и не понимаю почему(
Отредактировано (Март 4, 2011 15:13:10)
Офлайн
Был неправ. Верно, после выхода из Request.handle() сокет прикрывается. Извиняюсь.
Офлайн
Тогда понятно. А есть ли способ его как то переоткрыть? Ведь как по другому я отправлю клиенту сообщение?
Отредактировано (Март 4, 2011 17:02:12)
Офлайн
Если оставаться в рамках SocketServer - то не нужно выходить из Request.handle
И чем скорее вы изобретете тот или иной (предпочтительно пакетный) протокол общения - тем вам будет легче.
Офлайн