From: <ast...@gm...> - 2007-07-12 05:14:02
|
Hi again. Sorry to bring up this topic, but I think there are still some problems with the sockets. Here's the scenario: Client connects to server. At some point, server closes the socket (for whatever reason), and client is *not* aware of it. Client tries to send data in that socket, but uses try/except so that it can catch any socket error. The first time the client attempts to send data to the server (at this point, the server has closed the socket), no error is raised (similar behavior with Python2.5). But at the second time the client attempts to send data to the server, Python2.5 raises an error, and the client successfully catches it. In Jython2.2 RC 2, however, a java.io.IOException occurs. So client script can't do anything to stop it. How do I detect if the socket's been closed by the server btw? Even Python2.5 only tells you that it's been closed on second attempt to send data. I am using JRE1.6.0 on Windows98. Here are the results of running the same script: C:\Python25>python socketbug.py Server opened Server listening Client opened Client connecting Client will send data to socket after 5 seconds Server has accepted client Server has closed all sockets Client trying to send data Client attempting to send data. Try no. 1 Client attempting to send data. Try no. 2 Socket error at try no. 2 Client closed from try no. 2 Done C:\jython2.2rc2>python socketbug.py Server opened Server listening Client opened Client connecting Client will send data to socket after 5 seconds Server has accepted client Server has closed all sockets Client trying to send data Client attempting to send data. Try no. 1 Client attempting to send data. Try no. 2 Exception in thread Thread-2: Traceback (most recent call last): File "C:\jython2.2rc2\Lib\threading.py", line 414, in _Thread__bootstrap self.run() File "C:\jython2.2rc2\Lib\threading.py", line 522, in run self.function(*self.args, **self.kwargs) File "socketbug.py", line 38, in sockwrite self.sendtry(self.sockname, 2) File "socketbug.py", line 44, in sendtry s.send('Hello') File "C:\jython2.2rc2\Lib\socket.py", line 532, in send numwritten = self.sock_impl.write(s) File "C:\jython2.2rc2\Lib\socket.py", line 110, in write count = self.jchannel.write(bytebuf) java.io.IOException: java.io.IOException: Write failed Here is the script that I used: import socket, threading class SimpleServer(threading.Thread): def __init__(self): print "Server opened" def run(self): serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serversocket.bind(('localhost', 6667)) serversocket.listen(1) print "Server listening" while 1: (clientsocket, address) = serversocket.accept() print "Server has accepted client" break clientsocket.close() serversocket.close() print "Server has closed all sockets" class SimpleClient: def __init__(self): print "Client opened" def connect(self): print "Client connecting" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 6667)) self.sockname = s print 'Client will send data to socket after 5 seconds' t = threading.Timer(5, self.sockwrite) t.start() def sockwrite(self): print 'Client trying to send data' self.sendtry(self.sockname, 1) self.sendtry(self.sockname, 2) print "Done" def sendtry(self, s, n): print "Client attempting to send data. Try no. %s" % n try: s.send('Hello') except socket.error: print "Socket error at try no. %s" % n s.close() print "Client closed from try no. %s" % n def openclient(): c = SimpleClient() c.connect() def main(): t = threading.Timer(10, openclient) t.start() server = SimpleServer() server.run() if __name__ == '__main__': main() That's it, and I apologize for the very lengthy email. Thanks and regards :-) astigmatik |
From: <ast...@gm...> - 2007-07-12 05:18:04
|
On 7/12/07, ast...@gm... <ast...@gm...> wrote: > C:\jython2.2rc2>python socketbug.py > Server opened > Server listening Btw, that should read as: C:\jython2.2rc2>jython socketbug.py I had to copy and paste the first few lines from the Python experiment because my DOS window couldn't show them when I run the same thing in Jython. astigmatik |
From: <ast...@gm...> - 2007-07-12 09:19:35
|
Btw, I ran the same script on Jython2.2b2 (Win98, JRE1.6.0), and it works fine: C:\Jython2.2b2>jython socketbug.py Server opened Server listening Client opened Client connecting Client will send data to socket after 5 seconds Server has accepted client Server has closed all sockets Client trying to send data Client attempting to send data. Try no. 1 Client attempting to send data. Try no. 2 Socket error at try no. 2 Client closed from try no. 2 Done On 7/12/07, ast...@gm... <ast...@gm...> wrote: > Hi again. Sorry to bring up this topic, but I think there are still > some problems with the sockets. |
From: Alan K. <jyt...@xh...> - 2007-07-15 11:38:30
|
[astigmatik] > The first time the client attempts to send data to the server (at this > point, the server has closed the socket), no error is raised (similar > behavior with Python2.5). But at the second time the client attempts > to send data to the server, Python2.5 raises an error, and the client > successfully catches it. > > In Jython2.2 RC 2, however, a java.io.IOException occurs. So client > script can't do anything to stop it. Are you sure about that? Specifically, what code do you have put in place to catch that exception? If it is raising a java.io.IOException, then you would have to use the following code to catch it try: socket.op() except java.io.IOException, jiox: print "There was a java IO exception" But I think your code is actually raising a socket.error, and the java.io.IOException is wrapped in that. So the following code will catch that try: socket.op() except socket.error, se: print "Socket exception is: %s" % se[1] "Socket exception is: Unmapped java exception: java.io.IOException" Am I wrong? I need to put in another mapping for that exception. Alan. |
From: <ast...@gm...> - 2007-07-15 12:29:52
|
On 7/15/07, Alan Kennedy <jyt...@xh...> wrote: > [astigmatik] > > The first time the client attempts to send data to the server (at this > > point, the server has closed the socket), no error is raised (similar > > behavior with Python2.5). But at the second time the client attempts > > to send data to the server, Python2.5 raises an error, and the client > > successfully catches it. > > > > In Jython2.2 RC 2, however, a java.io.IOException occurs. So client > > script can't do anything to stop it. > > Are you sure about that? Specifically, what code do you have put in > place to catch that exception? > > If it is raising a java.io.IOException, then you would have to use the > following code to catch it > > try: > socket.op() > except java.io.IOException, jiox: > print "There was a java IO exception" > > But I think your code is actually raising a socket.error, and the > java.io.IOException is wrapped in that. So the following code will catch > that > > try: > socket.op() > except socket.error, se: > print "Socket exception is: %s" % se[1] > > "Socket exception is: Unmapped java exception: java.io.IOException" > > Am I wrong? > > I need to put in another mapping for that exception. > If you look at the code that I included in the email, specifically the one below, I do have a simple "except socket.error:" in place. When sendtry() is first called, no error is raised (both in Jython and Python). Second time sendtry() is called, Python raises the socket error, Jython doesn't and it immediately gives me the "Exception in thread Thread-2:... Traceback (most recent call last):" error. def sendtry(self, s, n): print "Client attempting to send data. Try no. %s" % n try: s.send('Hello') except socket.error: print "Socket error at try no. %s" % n s.close() print "Client closed from try no. %s" % n In terms of Jython's reaction, probably there's a difference between: except socket.error: and except socket.error, error_message_here: I do hope that others will also try the snippet that I have included in first email just to verify this thing? I have pasted it on: http://www.nomorepasting.com/getpaste.php?pasteid=1424 for everyone's convenience. Thanks and best regards. astigmatik |