socket client server... simple example... not working...

Discussion in 'Python' started by SpreadTooThin, Oct 5, 2006.

  1. client:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("192.168.1.101", 8080))
    print 'Connected'
    s.send('ABCD')
    buffer = s.recv(4)
    print buffer
    s.send('exit')


    server:

    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind(("192.168.1.101", 8080))
    serversocket.listen(5)
    print 'Listen'
    (clientsocket, address) = serversocket.accept()
    print 'Accepted'
    flag = True
    while flag:
    chunk = serversocket.recv(4)
    if chunk == '':
    raise RuntimeError, "socket connection broken"
    elif chunk == 'exit':
    flag = False
    else:
    serversocket.send(chunk)
    print 'Done'

    Server says!

    Listen
    Accepted
    Traceback (most recent call last):
    File "server.py", line 11, in ?
    chunk = serversocket.recv(4)
    socket.error: (57, 'Socket is not connected')


    Client says:
    Connected

    What have I done wrong now!
     
    SpreadTooThin, Oct 5, 2006
    #1
    1. Advertising

  2. Jean-Paul Calderone wrote:
    > On 4 Oct 2006 19:31:38 -0700, SpreadTooThin <> wrote:
    > >client:
    > >
    > >import socket
    > >s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    > >s.connect(("192.168.1.101", 8080))
    > >print 'Connected'
    > >s.send('ABCD')

    >
    > Here you didn't check the return value of send to determine if all of the string was copied to the kernel buffer to be sent, so you may have only succeeded in sending part of 'ABCD'.
    >
    > >buffer = s.recv(4)

    >
    > in the above call, 4 is the maximum number of bytes recv will return. It looks as though you are expecting it to return exactly 4 bytes, but in order to get that, you will need to check the length of the return value and call recv again with a lower limit until the combination of the return values of each call gives a total length of 4.
    >
    > >print buffer
    > >s.send('exit')

    >
    > Again, you didn't check the return value of send.
    >
    > >
    > >
    > >server:
    > >
    > >serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    > >serversocket.bind(("192.168.1.101", 8080))
    > >serversocket.listen(5)
    > >print 'Listen'
    > >(clientsocket, address) = serversocket.accept()
    > >print 'Accepted'
    > >flag = True
    > >while flag:
    > > chunk = serversocket.recv(4)

    >
    > You're calling recv on serversocket instead of on clientsocket. You're also relying on recv to return exactly 4 bytes, which it may not do.
    >
    > > if chunk == '':
    > > raise RuntimeError, "socket connection broken"
    > > elif chunk == 'exit':
    > > flag = False
    > > else:
    > > serversocket.send(chunk)

    >
    > Another missing check of the return value of send.
    >
    > >print 'Done'
    > >
    > >Server says!
    > >
    > >Listen
    > >Accepted
    > >Traceback (most recent call last):
    > > File "server.py", line 11, in ?
    > > chunk = serversocket.recv(4)
    > >socket.error: (57, 'Socket is not connected')
    > >
    > >
    > >Client says:
    > >Connected
    > >
    > >What have I done wrong now!

    >
    > I recommend switching to Twisted. The Twisted equivalent (I guess - the protocol defined above is strange and complex (probably unintentionally, due to the things you left out, like any form of delimiter) and I doubt I really understand the end goal you are working towards), minus bugs (untested):
    >
    > # client.py
    > from twisted.internet import reactor, protocol
    >
    > class Client(protocol.Protocol):
    > buf = ''
    > def connectionMade(self):
    > self.transport.write('ABCD')
    > def dataReceived(self, data):
    > self.buf += data
    > if len(self.buf) >= 4:
    > reactor.stop()
    >
    > protocol.ClientCreator(reactor, Client).connectTCP('192.168.1.101', 8080)
    > reactor.run()
    >
    > # server.py
    > from twisted.internet import reactor, protocol
    >
    > class Server(protocol.Protocol):
    > buf = ''
    > def dataReceived(self, bytes):
    > self.buf += bytes
    > exit = self.buf.find('exit')
    > if exit != -1:
    > self.transport.write(self.buf[:exit])
    > self.buf = self.buf[exit + 4:]
    > reactor.stop()
    > else:
    > self.transport.write(self.buf)
    > self.buf = ''
    >
    > f = protocol.ServerFactory()
    > f.protocol = Server
    > reactor.listenTCP('192.168.1.101', 8080, f)
    > reactor.run()
    >
    > Hope this helps,
    >
    > Jean-Paul


    Jean-Paul many thanks for this and your effort.
    but why is it every time I try to do something with 'stock' python I
    need another package?
    By the time I've finished my project there are like 5 3rd party add-ons
    to be installed.
    I know I'm a python newbie... but I'm far from a developer newbie and
    that can be a recipe for
    disaster. The stock socket should work and I think I've missed an
    obvious bug in the code other
    than checking the return status.
     
    SpreadTooThin, Oct 5, 2006
    #2
    1. Advertising

  3. Jean-Paul Calderone wrote:
    > On 5 Oct 2006 07:01:50 -0700, SpreadTooThin <> wrote:
    > > [snip]
    > >
    > >Jean-Paul many thanks for this and your effort.
    > >but why is it every time I try to do something with 'stock' python I
    > >need another package?

    >
    > Maybe you are trying to do things that are too complex :)
    >

    No quite the contrary.. Which is why I want to keep it simple...

    > >By the time I've finished my project there are like 5 3rd party add-ons
    > >to be installed.

    >
    > I don't generally find this to be problematic.
    >

    I have because it usually means makeing on many platforms...
    Most of the time this is the nightmare.


    > >I know I'm a python newbie... but I'm far from a developer newbie and
    > >that can be a recipe for
    > >disaster.

    >
    > Not every library can be part of the standard library, neither can the
    > standard library satisfy every possible use-case. Relying on 3rd party
    > modules isn't a bad thing.
    >

    No but the less number of lines of code I have to support the better.


    > >The stock socket should work and I think I've missed an
    > >obvious bug in the code other
    > >than checking the return status.
    > >

    >

    It was indeed as you said I was trying to read/write on the server
    socket
    not the client socket. (of the server module)


    > Well, I did mention one bug other than failure to check return values.
    > Maybe you missed it, since it was in the middle. Go back and re-read
    > my response.
    >


    Thanks again.
    B.

    > Jean-Paul
     
    SpreadTooThin, Oct 5, 2006
    #3
  4. SpreadTooThin

    Bryan Olson Guest

    SpreadTooThin wrote:
    > Jean-Paul many thanks for this and your effort.
    > but why is it every time I try to do something with 'stock' python I
    > need another package?


    Twisted has it's fan, but you don't "need" it. Your code had a few
    specific problems, and fixing them has little or nothing to do with
    Twisted.

    > By the time I've finished my project there are like 5 3rd party add-ons
    > to be installed.
    > I know I'm a python newbie... but I'm far from a developer newbie and
    > that can be a recipe for
    > disaster. The stock socket should work and I think I've missed an
    > obvious bug in the code other
    > than checking the return status.


    Obviously you wanted to recv() on your 'clientsocket' not your
    'seversocket'. You can use sendall() to send all the given data;
    it will raise an exception if it fails so there's no return code to
    check. Since TCP is a stream protocol and does not have any concept
    of message boundaries, you'll need to delimit messages within your
    protocol, and call recv() until you have an entire message.


    --
    --Bryan
     
    Bryan Olson, Oct 6, 2006
    #4
  5. SpreadTooThin wrote:

    > but why is it every time I try to do something with 'stock' python I
    > need another package?


    it's well known that all problems known to man can be solved by down-
    loading Twisted, PyParsing, the Stream Editor, or that other programming
    language that cannot be named.

    </F>
     
    Fredrik Lundh, Oct 6, 2006
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Avizz
    Replies:
    3
    Views:
    14,026
    Andy Fish
    Sep 29, 2003
  2. Michael Goettsche

    Basic Server/Client socket pair not working

    Michael Goettsche, Aug 29, 2005, in forum: Python
    Replies:
    1
    Views:
    309
    Nicolas Couture
    Aug 29, 2005
  3. Jp Calderone
    Replies:
    0
    Views:
    680
    Jp Calderone
    Aug 29, 2005
  4. Stephen Ware

    Simple socket server not working?

    Stephen Ware, Oct 10, 2007, in forum: Ruby
    Replies:
    7
    Views:
    149
    Martin Portman
    Oct 10, 2007
  5. Mark_Galeck
    Replies:
    3
    Views:
    273
    Mark_Galeck
    Aug 16, 2009
Loading...

Share This Page