在WinXP上SocketServer客户端第三次send()时出现套接字错误
我遇到了一个错误,内容是:
"socket.error: [10053] '软件导致连接中断'"
错误追踪(最近的调用最后):... self.send(json.dumps([0x02, subItems])+"\n") ... sent = self.handler.send(data) socket.error: [Errno 10053]
我已经正确建立了服务器,可以连接上去,发送“hello”消息,然后我还能再发送一个0x1类型的消息。但接下来客户端的操作服务器那边就看不见了。客户端程序抛出了上面的socket.error错误。
import SocketServer
class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):
def handle(self):
#data = json.loads(self.request.recv(1024))
if(self.request in subengine.sub.get_all_sub()):
pass
else:
#login = json.loads(self.request.recv(1024))
login = json.loads(self.rfile.readline().strip())
logging.debug("User : %s connected" % login )
data = json.loads(self.rfile.readline().strip())
if(data[0]==0x1): # subscribe
logging.info("subscribe message received, from %d" % self.request.fileno())
logging.info("symbols to subscribe: %s" % data[1])
elif (data[0] == 0x2): # unsubscribe
logging.info("unsubscribe message received")
else:
pass
# def finish(self):
# logging.info("terminating connection")
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
server = ThreadedTCPServer(('localhost',5555), ThreadedTCPRequestHandler)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
客户端代码示例:
class Client:
handler = None
def __init__(self, uname = '', host = 'localhost', port = 0, sock = None):
if sock is None:
self.handler = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.host = host
self.port = port
self.uname = uname
def feed_conection(self):
self.handler.connect((self.host, self.port))
if(self.handler != 0):
self.handler.send(json.dumps(self.uname)+"\n")
else:
print ("Nie udalo sie polaczyc")
def sub(self, subItems):
self.send(json.dumps([0x01, subItems])+"\n")
def unsub(self, subItems):
self.send(json.dumps([0x02, subItems])+"\n")
def send(self, data):
data_len = len(data)
total_sent = 0
while(total_sent < data_len):
sent = self.handler.send(data)
if not sent:
break
data = data[sent:]
total_sent += sent
1 个回答
0
如果你说的情况是真的,也就是说你的主服务器代码是这样结束的……:
server_thread.setDaemon(True)
server_thread.start()
那么你的代码实际上是在说:让 server_thread
在主线程结束时就死掉,让 server_thread
启动,然后让主线程结束——也就是说,你是在 start
一个后台线程后就“掉头”结束了?这可不对——一旦操作系统切换回你的主线程,哗啦,服务器那边的所有东西就都死掉了,正是你编程时设定的那样(所以当然,客户端想要继续和那个服务器对话就会遇到问题!)。你为什么要把 server_thread
设置为后台线程,却让主线程直接结束呢?也许你并没有贴出你实际使用的代码……?