mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
							parent
							
								
									ef6a19e3ea
								
							
						
					
					
						commit
						06fd5f8cc8
					
				
					 5 changed files with 38 additions and 30 deletions
				
			
		| 
						 | 
					@ -56,7 +56,8 @@ def client():
 | 
				
			||||||
        line = sys.stdin.readline()
 | 
					        line = sys.stdin.readline()
 | 
				
			||||||
        if not line:
 | 
					        if not line:
 | 
				
			||||||
            break
 | 
					            break
 | 
				
			||||||
        s.sendto(line, addr)
 | 
					        print('addr = ', addr)
 | 
				
			||||||
 | 
					        s.sendto(bytes(line, 'ascii'), addr)
 | 
				
			||||||
        data, fromaddr = s.recvfrom(BUFSIZE)
 | 
					        data, fromaddr = s.recvfrom(BUFSIZE)
 | 
				
			||||||
        print('client received %r from %r' % (data, fromaddr))
 | 
					        print('client received %r from %r' % (data, fromaddr))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
FILE = 'unix-socket'
 | 
					FILE = 'unix-socket'
 | 
				
			||||||
s = socket(AF_UNIX, SOCK_STREAM)
 | 
					s = socket(AF_UNIX, SOCK_STREAM)
 | 
				
			||||||
s.connect(FILE)
 | 
					s.connect(FILE)
 | 
				
			||||||
s.send('Hello, world')
 | 
					s.send(b'Hello, world')
 | 
				
			||||||
data = s.recv(1024)
 | 
					data = s.recv(1024)
 | 
				
			||||||
s.close()
 | 
					s.close()
 | 
				
			||||||
print('Received', repr(data))
 | 
					print('Received', repr(data))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -336,8 +336,8 @@ This is the server side::
 | 
				
			||||||
       def handle(self):
 | 
					       def handle(self):
 | 
				
			||||||
           # self.request is the TCP socket connected to the client
 | 
					           # self.request is the TCP socket connected to the client
 | 
				
			||||||
           self.data = self.request.recv(1024).strip()
 | 
					           self.data = self.request.recv(1024).strip()
 | 
				
			||||||
           print "%s wrote:" % self.client_address[0]
 | 
					           print("%s wrote:" % self.client_address[0])
 | 
				
			||||||
           print self.data
 | 
					           print(self.data)
 | 
				
			||||||
           # just send back the same data, but upper-cased
 | 
					           # just send back the same data, but upper-cased
 | 
				
			||||||
           self.request.send(self.data.upper())
 | 
					           self.request.send(self.data.upper())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -360,8 +360,8 @@ objects that simplify communication by providing the standard file interface)::
 | 
				
			||||||
           # self.rfile is a file-like object created by the handler;
 | 
					           # self.rfile is a file-like object created by the handler;
 | 
				
			||||||
           # we can now use e.g. readline() instead of raw recv() calls
 | 
					           # we can now use e.g. readline() instead of raw recv() calls
 | 
				
			||||||
           self.data = self.rfile.readline().strip()
 | 
					           self.data = self.rfile.readline().strip()
 | 
				
			||||||
           print "%s wrote:" % self.client_address[0]
 | 
					           print("%s wrote:" % self.client_address[0])
 | 
				
			||||||
           print self.data
 | 
					           print(self.data)
 | 
				
			||||||
           # Likewise, self.wfile is a file-like object used to write back
 | 
					           # Likewise, self.wfile is a file-like object used to write back
 | 
				
			||||||
           # to the client
 | 
					           # to the client
 | 
				
			||||||
           self.wfile.write(self.data.upper())
 | 
					           self.wfile.write(self.data.upper())
 | 
				
			||||||
| 
						 | 
					@ -385,14 +385,14 @@ This is the client side::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   # Connect to server and send data
 | 
					   # Connect to server and send data
 | 
				
			||||||
   sock.connect((HOST, PORT))
 | 
					   sock.connect((HOST, PORT))
 | 
				
			||||||
   sock.send(data + "\n")
 | 
					   sock.send(bytes(data + "\n","utf8"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   # Receive data from the server and shut down
 | 
					   # Receive data from the server and shut down
 | 
				
			||||||
   received = sock.recv(1024)
 | 
					   received = sock.recv(1024)
 | 
				
			||||||
   sock.close()
 | 
					   sock.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   print "Sent:     %s" % data
 | 
					   print("Sent:     %s" % data)
 | 
				
			||||||
   print "Received: %s" % received
 | 
					   print("Received: %s" % received)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The output of the example should look something like this:
 | 
					The output of the example should look something like this:
 | 
				
			||||||
| 
						 | 
					@ -401,18 +401,18 @@ Server::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ python TCPServer.py
 | 
					   $ python TCPServer.py
 | 
				
			||||||
   127.0.0.1 wrote:
 | 
					   127.0.0.1 wrote:
 | 
				
			||||||
   hello world with TCP
 | 
					   b'hello world with TCP'
 | 
				
			||||||
   127.0.0.1 wrote:
 | 
					   127.0.0.1 wrote:
 | 
				
			||||||
   python is nice
 | 
					   b'python is nice'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Client::
 | 
					Client::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ python TCPClient.py hello world with TCP
 | 
					   $ python TCPClient.py hello world with TCP
 | 
				
			||||||
   Sent:     hello world with TCP
 | 
					   Sent:     hello world with TCP
 | 
				
			||||||
   Received: HELLO WORLD WITH TCP
 | 
					   Received: b'HELLO WORLD WITH TCP'
 | 
				
			||||||
   $ python TCPClient.py python is nice
 | 
					   $ python TCPClient.py python is nice
 | 
				
			||||||
   Sent:     python is nice
 | 
					   Sent:     python is nice
 | 
				
			||||||
   Received: PYTHON IS NICE
 | 
					   Received: b'PYTHON IS NICE'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:class:`socketserver.UDPServer` Example
 | 
					:class:`socketserver.UDPServer` Example
 | 
				
			||||||
| 
						 | 
					@ -433,13 +433,13 @@ This is the server side::
 | 
				
			||||||
       def handle(self):
 | 
					       def handle(self):
 | 
				
			||||||
           data = self.request[0].strip()
 | 
					           data = self.request[0].strip()
 | 
				
			||||||
           socket = self.request[1]
 | 
					           socket = self.request[1]
 | 
				
			||||||
           print "%s wrote:" % self.client_address[0]
 | 
					           print("%s wrote:" % self.client_address[0])
 | 
				
			||||||
           print data
 | 
					           print(data)
 | 
				
			||||||
           socket.sendto(data.upper(), self.client_address)
 | 
					           socket.sendto(data.upper(), self.client_address)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if __name__ == "__main__":
 | 
					   if __name__ == "__main__":
 | 
				
			||||||
      HOST, PORT = "localhost", 9999
 | 
					      HOST, PORT = "localhost", 9999
 | 
				
			||||||
      server = socketserver.UDPServer((HOST, PORT), BaseUDPRequestHandler)
 | 
					      server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
 | 
				
			||||||
      server.serve_forever()
 | 
					      server.serve_forever()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is the client side::
 | 
					This is the client side::
 | 
				
			||||||
| 
						 | 
					@ -447,7 +447,7 @@ This is the client side::
 | 
				
			||||||
   import socket
 | 
					   import socket
 | 
				
			||||||
   import sys
 | 
					   import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   HOST, PORT = "localhost"
 | 
					   HOST, PORT = "localhost", 9999
 | 
				
			||||||
   data = " ".join(sys.argv[1:])
 | 
					   data = " ".join(sys.argv[1:])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   # SOCK_DGRAM is the socket type to use for UDP sockets
 | 
					   # SOCK_DGRAM is the socket type to use for UDP sockets
 | 
				
			||||||
| 
						 | 
					@ -455,11 +455,11 @@ This is the client side::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   # As you can see, there is no connect() call; UDP has no connections.
 | 
					   # As you can see, there is no connect() call; UDP has no connections.
 | 
				
			||||||
   # Instead, data is directly sent to the recipient via sendto().
 | 
					   # Instead, data is directly sent to the recipient via sendto().
 | 
				
			||||||
   sock.sendto(data + "\n", (HOST, PORT))
 | 
					   sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
 | 
				
			||||||
   received = sock.recv(1024)
 | 
					   received = sock.recv(1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   print "Sent:     %s" % data
 | 
					   print("Sent:     %s" % data)
 | 
				
			||||||
   print "Received: %s" % received
 | 
					   print("Received: %s" % received)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The output of the example should look exactly like for the TCP server example.
 | 
					The output of the example should look exactly like for the TCP server example.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -481,7 +481,7 @@ An example for the :class:`ThreadingMixIn` class::
 | 
				
			||||||
       def handle(self):
 | 
					       def handle(self):
 | 
				
			||||||
           data = self.request.recv(1024)
 | 
					           data = self.request.recv(1024)
 | 
				
			||||||
           cur_thread = threading.current_thread()
 | 
					           cur_thread = threading.current_thread()
 | 
				
			||||||
           response = "%s: %s" % (cur_thread.get_name(), data)
 | 
					           response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
 | 
				
			||||||
           self.request.send(response)
 | 
					           self.request.send(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
 | 
					   class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
 | 
				
			||||||
| 
						 | 
					@ -492,7 +492,7 @@ An example for the :class:`ThreadingMixIn` class::
 | 
				
			||||||
       sock.connect((ip, port))
 | 
					       sock.connect((ip, port))
 | 
				
			||||||
       sock.send(message)
 | 
					       sock.send(message)
 | 
				
			||||||
       response = sock.recv(1024)
 | 
					       response = sock.recv(1024)
 | 
				
			||||||
       print "Received: %s" % response
 | 
					       print("Received: %s" % response)
 | 
				
			||||||
       sock.close()
 | 
					       sock.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if __name__ == "__main__":
 | 
					   if __name__ == "__main__":
 | 
				
			||||||
| 
						 | 
					@ -506,23 +506,24 @@ An example for the :class:`ThreadingMixIn` class::
 | 
				
			||||||
       # more thread for each request
 | 
					       # more thread for each request
 | 
				
			||||||
       server_thread = threading.Thread(target=server.serve_forever)
 | 
					       server_thread = threading.Thread(target=server.serve_forever)
 | 
				
			||||||
       # Exit the server thread when the main thread terminates
 | 
					       # Exit the server thread when the main thread terminates
 | 
				
			||||||
       server_thread.set_daemon(True)
 | 
					       server_thread.setDaemon(True)
 | 
				
			||||||
       server_thread.start()
 | 
					       server_thread.start()
 | 
				
			||||||
       print "Server loop running in thread:", t.get_name()
 | 
					       print("Server loop running in thread:", server_thread.getName())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       client(ip, port, "Hello World 1")
 | 
					       client(ip, port, b"Hello World 1")
 | 
				
			||||||
       client(ip, port, "Hello World 2")
 | 
					       client(ip, port, b"Hello World 2")
 | 
				
			||||||
       client(ip, port, "Hello World 3")
 | 
					       client(ip, port, b"Hello World 3")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       server.shutdown()
 | 
					       server.shutdown()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The output of the example should look something like this::
 | 
					The output of the example should look something like this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   $ python ThreadedTCPServer.py
 | 
					   $ python ThreadedTCPServer.py
 | 
				
			||||||
   Server loop running in thread: Thread-1
 | 
					   Server loop running in thread: Thread-1
 | 
				
			||||||
   Received: Thread-2: Hello World 1
 | 
					   Received: b"Thread-2: b'Hello World 1'"
 | 
				
			||||||
   Received: Thread-3: Hello World 2
 | 
					   Received: b"Thread-3: b'Hello World 2'"
 | 
				
			||||||
   Received: Thread-4: Hello World 3
 | 
					   Received: b"Thread-4: b'Hello World 3'"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The :class:`ForkingMixIn` class is used in the same way, except that the server
 | 
					The :class:`ForkingMixIn` class is used in the same way, except that the server
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -435,6 +435,7 @@ Martin von L
 | 
				
			||||||
Andrew I MacIntyre
 | 
					Andrew I MacIntyre
 | 
				
			||||||
Tim MacKenzie
 | 
					Tim MacKenzie
 | 
				
			||||||
Nick Maclaren
 | 
					Nick Maclaren
 | 
				
			||||||
 | 
					Don MacMillen
 | 
				
			||||||
Steve Majewski
 | 
					Steve Majewski
 | 
				
			||||||
Grzegorz Makarewicz
 | 
					Grzegorz Makarewicz
 | 
				
			||||||
Ken Manheimer
 | 
					Ken Manheimer
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,11 @@ Build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Issue #1656675: Register a drop handler for .py* files on Windows.
 | 
					- Issue #1656675: Register a drop handler for .py* files on Windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Tools/Demos
 | 
				
			||||||
 | 
					-----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Demos of the socketserver module now work with Python 3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
What's New in Python 3.0 release candidate 2
 | 
					What's New in Python 3.0 release candidate 2
 | 
				
			||||||
============================================
 | 
					============================================
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue