rpc.py:SocketIO - Large modules were generating large pickles when downloaded
to the execution server.  The return of the OK response from the subprocess
initialization was interfering and causing the sending socket to be not
ready.  Add an IO ready test to fix this.  Moved the polling IO ready test
into pollpacket().

M NEWS.txt
M rpc.py

Backport candidate.
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index 7f52564..e2d4fc0 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -3,6 +3,14 @@
 
 *Release date: XX-XXX-2004*
 
+- rpc.py:SocketIO - Large modules were generating large pickles when downloaded
+  to the execution server.  The return of the OK response from the subprocess
+  initialization was interfering and causing the sending socket to be not
+  ready.  Add an IO ready test to fix this.  Moved the polling IO ready test
+  into pollpacket().
+
+- Fix typo in rpc.py, s/b "pickle.PicklingError" not "pickle.UnpicklingError".
+
 - Added a Tk error dialog to run.py inform the user if the subprocess can't
   connect to the user GUI process.  Added a timeout to the GUI's listening
   socket.  Added Tk error dialogs to PyShell.py to announce a failure to bind
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index 90451e3..d3a9fd8 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -320,23 +320,20 @@
         self.debug("putmessage:%d:" % message[0])
         try:
             s = pickle.dumps(message)
-        except pickle.UnpicklingError:
+        except pickle.PicklingError:
             print >>sys.__stderr__, "Cannot pickle:", `message`
             raise
         s = struct.pack("<i", len(s)) + s
         while len(s) > 0:
             try:
-                n = self.sock.send(s)
+                r, w, x = select.select([], [self.sock], [])
+                n = self.sock.send(s[:BUFSIZE])
             except (AttributeError, socket.error):
                 # socket was closed
                 raise IOError
             else:
                 s = s[n:]
 
-    def ioready(self, wait):
-        r, w, x = select.select([self.sock.fileno()], [], [], wait)
-        return len(r)
-
     buffer = ""
     bufneed = 4
     bufstate = 0 # meaning: 0 => reading count; 1 => reading data
@@ -344,7 +341,8 @@
     def pollpacket(self, wait):
         self._stage0()
         if len(self.buffer) < self.bufneed:
-            if not self.ioready(wait):
+            r, w, x = select.select([self.sock.fileno()], [], [], wait)
+            if len(r) == 0:
                 return None
             try:
                 s = self.sock.recv(BUFSIZE)
@@ -377,7 +375,7 @@
             return None
         try:
             message = pickle.loads(packet)
-        except:
+        except pickle.UnpicklingError:
             print >>sys.__stderr__, "-----------------------"
             print >>sys.__stderr__, "cannot unpickle packet:", `packet`
             traceback.print_stack(file=sys.__stderr__)