【问题标题】:Receiving socket data using Flask使用 Flask 接收套接字数据
【发布时间】:2020-01-18 05:59:12
【问题描述】:

我有一个 Flask 服务器,它当前显示一个 JSON 文件。我希望同一台服务器通过套接字接收数据流并将其保存到 JSON。 在堆栈溢出答案的帮助下,我已经起草了基础知识,但是当从客户端发送数据时,会抛出 404 message 并且没有运行代码来处理数据(在示例中打印 call decoding)。

服务器

from flask import Flask, json, Response
import os
import socket
import threading

app = Flask(__name__)
server_address =  ('', 5001)

@app.route('/')
def index():
    filename = os.path.join(app.static_folder, 'data.json')
    with open(filename) as data:
        data = json.load(data)
    return Response(json.dumps(data), mimetype='application/json')

def launch_socket_server():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(server_address)
    sock.listen(1)
    print('Listening...')

    while True:
        #Wait for connection
        connection, address = sock.accept()
        print('Connected', address)
    try:
        #Receive data
        while True:
            data = connection.recv(16)
            print(data)
            if data:
                print('call decoding')
    finally:
        #Clean up connection
        connection.close()

if __name__ == "__main__":
    t = threading.Thread(target=launch_socket_server)
    t.daemon = True
    t.start()
    app.run(debug=True, host='0.0.0.0', port=5000, use_reloader=False)

客户

import socket

server_address =  ('', 5001)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(server_address)
data = 'Ciao Daniela'
s.sendall(data.encode('utf-8'))
s.close()

服务器控制台错误

127.0.0.1 - - [17/Sep/2019 13:39:35] code 400, message Bad HTTP/0.9 request type ('Ciao')
127.0.0.1 - - [17/Sep/2019 13:39:35] "Ciao Daniela" HTTPStatus.BAD_REQUEST -

【问题讨论】:

  • 您是否在控制台/终端中运行它以查看错误消息?据我所知,系统无法运行具有相同端口的两个套接字,而 Flask 使用端口 5000 的一个套接字,而您尝试使用端口 5000 运行第二个套接字。在我的计算机上,我收到此地址:端口已被使用的错误,它可以'不创建套接字。
  • 是的,没错,我刚用 5000 和 5001 试过,效果很好。
  • @furas 我在使用同一个套接字时没有收到该错误。如果我使用 5000 然后 5001 我得到错误 61 连接被拒绝。
  • 您在企业防火墙后面的 Windows 上吗?在浏览器中使用正确的端口尝试 127.0.0.1。
  • 使用server_address = ('127.0.0.1', 5000) 通过客户端发送对我有用。使用server_address = ('', 5000) 我收到消息WinError 10049: The requested address is not valid in its context.

标签: python python-3.x sockets flask


【解决方案1】:
  • 您是否在公司防火墙后面的 Windows 上?在浏览器中使用正确的端口尝试 127.0.0.1 而不是 0.0.0.0。

  • 使用 server_address = ('127.0.0.1', 5000) 通过客户端发送对我有效。使用server_address = ('', 5000) 我收到消息

WinError 10049: 请求的地址在其上下文中无效

  • 为套接字和网络服务器使用两个不同的端口。我刚刚尝试了 5000 和 5001,效果很好。

你的缩进也是错误的。套接字卡在 while 循环中。

while True:
    #Wait for connection
    connection, address = sock.accept()
    print('Connected', address)

    # >>> STUCK HERE <<

try:
    #Receive data
    while True:
        data = connection.recv(16)
        print(data)
        if data:
            print('call decoding')
finally:
    #Clean up connection
    connection.close()

试试:

while True:
    #Wait for connection
    connection, address = sock.accept()
    print('Connected', address)
    try:
        #Receive data
        while True:
            data = connection.recv(16)
            print(data)
            if data:
                print('call decoding')
    finally:
        #Clean up connection
        connection.close()

【讨论】:

  • 感谢您的回复。我已经进行了更改,但现在得到了error 61 - connection refused。我正在使用我的手机作为主机,我想知道这是否是原因。
  • 你能ping手机还是从手机?
  • 我怀疑函数 launch_socket_server 没有运行。当我使用flask run 运行服务器时,我看不到打印Listening....
  • 您可以尝试在您的计算机上运行它,看看是否一切正常吗?
  • 我确实在本地运行它而没有连接到任何网络,但仍然得到相同的 61 错误。感谢您的帮助,这让我发疯了。我已将客户端和服务器上的套接字端口更改为 5001,并将地址指定为 127.0.0.1 并修复了缩进问题,但没有运气。
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多