【问题标题】:Erlang echo server with python client is not echoing, python client not receiving response correctly带有 python 客户端的 Erlang 回显服务器没有回显,python 客户端没有正确接收响应
【发布时间】:2021-07-06 09:27:04
【问题描述】:

所以我正在尝试启动一个 erlang 服务器,它将从我的 python 客户端回显。我可以看到连接已经建立,但是回声实际上并没有发生。谁能指出我正确的解决方案?

我使用 python3 作为我的客户端驱动程序。

这是我的 erlang 服务器:我用 echo:accept(6000) 启动它。

-module(echo).
-export([accept/1]).

%% Starts an echo server listening for incoming connections on
%% the given Port.
accept(Port) ->
    {ok, Socket} = gen_tcp:listen(Port, [binary, {active, true}, {packet, line}, {reuseaddr, true}]),
    io:format("Echo server listening on port ~p~n", [Port]),
    server_loop(Socket).

%% Accepts incoming socket connections and passes then off to a separate Handler process
server_loop(Socket) ->
    {ok, Connection} = gen_tcp:accept(Socket),
    Handler = spawn(fun () -> echo_loop(Connection) end),
    gen_tcp:controlling_process(Connection, Handler),
    io:format("New connection ~p~n", [Connection]),
    server_loop(Socket).

%% Echoes the incoming lines from the given connected client socket
echo_loop(Connection) ->
    receive
        {tcp, Connection, Data} ->
        gen_tcp:send(Connection, Data),
        echo_loop(Connection);
    {tcp_closed, Connection} ->
        io:format("Connection closed ~p~n", [Connection])
    end.

这是我的 python 客户端:

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('localhost', 6000)
print(sys.stderr, 'connecting to %s port %s' % server_address)
sock.connect(server_address)
try:
    
    # Send data
    message = 'This is the message.  It will be repeated.'
    convertedString = message.encode('utf-8')
    print(sys.stderr, 'sending "%s"' % message)
    sock.sendall(convertedString)

    # Look for the response
    amount_received = 0
    amount_expected = len(message)
    
    while amount_received < amount_expected:
        data = sock.recv(16).decode('utf-8')
        amount_received += len(data)
        print(sys.stderr, 'received "%s"' % data)

finally:
    print(sys.stderr, 'closing socket')
    sock.close()

我认为问题在于它只是在发送后挂起,现在它正在等待响应,我想我可能没有以正确的方式接收字符串。

【问题讨论】:

    标签: python erlang python-3.7 erlang-otp erlang-ports


    【解决方案1】:

    一个问题是您有{packet, line} 并且消息不包含新行,因此回显服务器在将消息发送到处理程序之前一直等待消息完成。

    此外,您应该小心使用active 选项,因为在controlling_process/2 调用期间收到的任何数据都将保留在前一个处理程序中。您应该使用{active, false} 启动接受的套接字,然后当套接字由处理程序管理时将其设置为true | pos_integer()

    【讨论】:

    • 是的,做到了。我从 Python 发送了一个换行符并对其进行了排序。谢谢。我会详细了解主动与被动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2022-01-09
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多