我是python socket编程的新手。我正在尝试创建一个简单的聊天应用程序我试图将数据从客户端程序发送到服务器,但在服务器程序中,同时接收我遇到的数据"超时"
我的客户端程序 -
import socket
PORT = 3017
def handler(req):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(("localhost", PORT))
except socket.error, msg:
print("error connecting socket")
s = None
finally:
f.close()
s.settimeout(10.0)
s.send(req)
line = s.recv(1024)
s.close()
return line
if __name__ == '__main__':
while(1):
input = raw_input(">")
resp = handler(input)
print resp
我的服务器程序 -
import socket
import SocketServer
class echo_server(SocketServer.StreamRequestHandler):
def handle(self):
timeout_telnet = float(2.0)
self.connection.settimeout(timeout_telnet)
data = []
# Read in all the lines.
while 1:
try:
line = self.rfile.readline()
except BaseException, e:
# Timeout.
print("error", e)
break
data.append(line)
print("data in handle method-\n", data)
self.wfile.write(("echo data- ".join(data)))
break
# Goodbye
def main():
s = SocketServer.ThreadingTCPServer(("", 3017), echo_server)
try:
s.serve_forever()
except KeyboardInterrupt:
print("Shutting down.")
s.socket.close()
if __name__ == "__main__":
main()
答案 0 :(得分:2)
您的问题是因为您在使用流套接字时需要控制消息长度。
那里发生了什么:
您的客户端发送一些数据(N字节)。 您的服务器从套接字读取数据,但它不知道您的“消息”是否已完成或将发送一些其他数据。
你能做什么? 如果你要替换
self.rfile.readline()
with self.request.recv(10) - 您的服务器将读取10个字节并将其发回。因此,您可以为服务器和客户端将相互发送的消息设置一些消息大小。
此处还有一些有用的信息: https://docs.python.org/2/howto/sockets.html#using-a-socket
以下是最简单聊天的示例:
客户端
def handler(req):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", PORT))
message = req
s.send(req)
print s.recv(1024)
s.close()
SERVER 的
def handle(self):
while True:
line = self.request.recv(1024)
if line:
print("data in handle method-\n", line.strip())
self.wfile.write(line)
但是你可能会在以后遇到一些问题,python文档可以帮助你理解它是如何工作的。
答案 1 :(得分:0)
真正的问题是服务器正在等待从客户端发送更多消息,导致超时。我找到了一个有效的解决方案 在客户端程序中添加此行
s.shutdown(1)
之后
s.send(req)
并在服务器程序中替换
line = self.rfile.readline()
与
line = self.request.recv(1024)
shutdown(1)告诉服务器“此客户端已完成发送,但仍可以接收。”