On Jul 26, 11:07 am, MRAB <pyt...@mrabarnett.plus.com> wrote:
> Paul Barry wrote:
> > I'm trying to get one of the examples from Foundation of Python
> > Network Programming to work.  Specifically this is the UDP example
> > from Ch 3.  First there is the server:
>
> > #!/usr/bin/env python
> > # UDP Echo Server - Chapter 3 - udpechoserver.py
> > import socket, traceback, time
>
> > host = '127.0.0.1'                               # Bind to all
> > interfaces
> > port = 51423
>
> > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> > s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
> > s.bind((host, port))
>
> > while 1:
> >     try:
> >         message, address = s.recvfrom(8192)
> >         print "Got message '%s' from %s" % (message, address)
>
> >         # Echo it back
> >         s.sendto(message, address)
> >         print "Sent response to '%s'" % (address,)
>
> >     except (KeyboardInterrupt, SystemExit):
> >         raise
> >     except:
> >         traceback.print_exc()
>
> > Next I have a client written in Ruby, which works.  I am posting thing
> > not to start a Ruby/Python flame war, but to simply prove that the
> > server works and there are no weird networking issues that would
> > prevent the Python client from working.  The Ruby code is:
>
> > #!/usr/bin/env ruby
> > require 'socket'
>
> > socket = UDPSocket.new
> > socket.connect ARGV[0], ARGV[1]
>
> > puts "Enter data to transmit: "
> > data = STDIN.gets.chomp
>
> > socket.send data, 0
> > puts "Looking for replies; press Ctrl-C or Ctrl-Break to stop."
>
> > loop do
> >   buf = socket.recvfrom(2048)
> >   puts buf.first
> > end
>
> > When I start the server and run that, the output looks like this:
>
> > $ ch02/udp.rb 127.0.0.1 51423
> > Enter data to transmit:
> > foobar
> > Looking for replies; press Ctrl-C or Ctrl-Break to stop.
> > foobar
>
> > Now, when I try the python example:
>
> > #!/usr/bin/env python
> > # UDP Example - Chapter 2 - udp.py
>
> > import socket, sys
>
> > host = sys.argv[1]
> > textport = sys.argv[2]
>
> > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> > try:
> >     port = int(textport)
> > except ValueError:
> >     # That didn't work.  Look it up instead.
> >     port = socket.getservbyname(textport, 'udp')
>
> > s.connect((host, port))
> > print "Enter data to transmit: "
> > data = sys.stdin.readline().strip()
> > s.sendall(data)
>
> > print "Looking for replies; press Ctrl-C or Ctrl-Break to stop."
> > while 1:
> >     buf = s.recvfrom(2048)
> >     sys.stdout.write(buf[0])
>
> > I don't ever get a response:
>
> > $ ch02/udp.py 127.0.0.1 51423
> > Enter data to transmit:
> > foobar
> > Looking for replies; press Ctrl-C or Ctrl-Break to stop.
>
> > The server sees the message and says it has sent a reply:
>
> > Got message 'foobar' from ('127.0.0.1', 49623)
> > Sent response to '('127.0.0.1', 49623)'
>
> > Any ideas as to why this doesn't work?
>
> It works on my PC (Python 2.6.2, Windows XP Pro, service pack 3).

Doesn't work on a Mac with Python 2.5.1 or 2.6.2 unless you flush
stdout or change it to print.  Not sure why it would work on one
platform and not the other.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to