Python - 服务器和客户端问题
问题描述
我正在尝试创建一个基本的服务器和客户端脚本.这个想法是客户端可以连接到服务器并执行命令.有点像 SSH,但非常简单.这是我的服务器代码:
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()
这是我的客户:
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()
这是我的问题.我启动服务器,然后在同一台机器上运行客户端.我输入端口并连接.然后我得到raw_input,它是'$'.如果我键入像ls"这样的命令,它只会挂在客户端.我必须退出服务器才能让客户端接收 ls 的输出.顺便说一句,我正在运行 Ubuntu Linux.不确定这是否重要.
Here is my problem. I start the server and then run the client on the same machine. I enter the port and 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.
解决方案
当你在 socket 上 makefile() 然后在上面使用 readlines() 时,它会一直持续到你到达文件末尾,在 socket 的情况下是不是从另一端关闭了.
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.
在这种情况下使用 makefile() 对我来说毫无意义,尤其是因为您创建它并在每个命令之后关闭它.只需在两端使用 send() 和 recv() 即可.
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. :)
更新一个有效的例子:
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
" % 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
相关文章