简体   繁体   English

Erlang 回显服务器与 python 客户端未回显,python 客户端未正确接收响应

[英]Erlang echo server with python client is not echoing, python client not receiving response correctly

So I'm trying to get an erlang server started, which will echo back from my python client.所以我试图启动一个 erlang 服务器,它将从我的 python 客户端回显。 I can see the connection is made, however the echo doesn't actually happen.我可以看到连接已经建立,但是回声实际上并没有发生。 Can anybody point me to the right solution?谁能指出我正确的解决方案?

I'm using python3 as my client driver.我使用 python3 作为我的客户端驱动程序。

Here is my erlang server: I start it with echo:accept(6000).这是我的 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.

here is my python client:这是我的 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()

I think the problem is it just hangs after sending, and now it's waiting for a response, I think I might not be receiving the string in the right way.我认为问题在于它只是在发送后挂起,现在它正在等待响应,我想我可能没有以正确的方式接收字符串。

One issue is that you have {packet, line} and the message does not include a new line, so the echo server keeps waiting for the message to be completed before sending it to the handler.一个问题是您有{packet, line}并且消息不包含新行,因此回显服务器在将消息发送到处理程序之前一直等待消息完成。

Also, you should be careful with the active option, as any data that is received during the controlling_process/2 call will remain in the previous handler.此外,您应该小心使用active选项,因为在controlling_process/2调用期间收到的任何数据都将保留在前一个处理程序中。 You should start the accepted socket with {active, false} and then set it to true | pos_integer()您应该使用{active, false}启动接受的套接字,然后将其设置为true | pos_integer() true | pos_integer() when the socket is managed by the handler. true | pos_integer()当套接字由处理程序管理时。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM