开发者

Python - Server and client problems

I'm trying to create a basic server and client script. The idea is that the client can connect to the server and execute commands. Kinda like SSH but very simple. Heres my server code:

import sys, os, socket


host = ''                
port = 50103
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: ", port)
s.listen(1)
while (1):
    conn, addr = s.accept()
    print 'New connection from ', addr
    try:
        while True:
            rc = conn.recv(2)
            pipe = os.popen(rc)
            rl = pipe.readlines()
            fl = conn.makefile('w', 0)
            fl.writelines(rl[:-1])
            fl.close()
    except IOError:
            conn.close()

And here is my client:

import sys, socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = input('Port: ')
s.connect((host, port))
while (1):
    cmd = raw_input('$ ')
    s.send(cmd) 
    file = s.makefile('r', 0)
    sys.stdout.writelines(file.readlines())
    file.close()

Here is my problem. I start the server and then run the client on the same machine. I enter the port a开发者_如何学运维nd connect. Then I get the raw_input which is the '$'. If I type a command like 'ls' it just hangs on the client side. I have to exit the server for the client to receive the output of ls. By the way I am running Ubuntu Linux. Not sure if that matters.


When you makefile() on the socket and then use readlines() on it, it will continue until you reach an end of file, which in the socket case is that it closed from the other end.

Using makefile() in this case makes no sense to me, especially since you create it and close it after each command. Just use send() and recv() on both ends.

You probably also want to have some sort of actual "protocol" so the server tells the client "HERE COMES A RESPONSE" and "THIS IS THE END OF THE RESPONSE" so that the client knows. Otherwise it gets hard to know when to stop waiting for more response. :)

Update with an example that works:

server.py:

import sys, os, socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 50500))
print("Server started")
s.listen(1)
while True:
    print "Accepting"
    conn, addr = s.accept()
    print 'New connection from ', addr
    while True:
        try:
            rc = conn.recv(1024)
            print "Command", rc
            if not rc.strip():
                continue

            if rc.strip() == 'END':
                print "Close"
                conn.send("**END**")
                conn.close()
                break
            else:
                conn.send("This is the result of command %s\n" % rc)
        except Exception:
            conn.close()
            sys.exit()

client.py

import sys, os, socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 50500))
while True:
    cmd = raw_input('$ ')
    s.send(cmd) 
    result = s.recv(1024)
    print result
    if result == "**END**":
        print "Ending"
        break


Well for one thing you're only connecting on the client once and on the server you're closing the socket after every read.

You should take a look at this example.

http://ilab.cs.byu.edu/python/socket/echoserver.html

You're doing quite a few things incorrectly.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜