我正在尝试创建基本的服务器和客户端脚本。这个想法是客户端可以连接到服务器并执行命令。有点像SSH,但非常简单。继承我的服务器代码:
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。不确定这是否重要。
答案 0 :(得分:2)
当你在套接字上makefile()然后在它上面使用readlines()时,它会一直持续到你到达文件的末尾,在套接字的情况下它是从另一端关闭的。
在这种情况下使用makefile()对我来说没有任何意义,特别是因为你创建它并在每个命令后关闭它。只需在两端使用send()和recv()。
您可能还希望拥有某种实际的“协议”,以便服务器告诉客户“此处有响应”和“这是响应的结束”,以便客户知道。否则很难知道何时停止等待更多响应。 :)
使用可行的示例进行更新:
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
答案 1 :(得分:1)
嗯,有一件事你只是在客户端上连接一次,而在服务器上,你在每次阅读后关闭套接字。
你应该看看这个例子。
http://ilab.cs.byu.edu/python/socket/echoserver.html
你做错了很多事。