带有 python 客户端的 Erlang 回显服务器没有回显,python 客户端没有正确接收响应
Erlang echo server with python client is not echoing, python client not receiving response correctly
所以我正在尝试启动一个 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()
我认为问题是它在发送后挂起,现在正在等待响应,我想我可能没有以正确的方式接收字符串。
一个问题是您 {packet, line}
并且消息不包含新行,因此回显服务器在将消息发送到处理程序之前一直等待消息完成。
此外,您应该小心使用 active
选项,因为在 controlling_process/2
调用期间收到的任何数据都将保留在前一个处理程序中。您应该使用 {active, false}
启动接受的套接字,然后在处理程序管理套接字时将其设置为 true | pos_integer()
。
所以我正在尝试启动一个 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()
我认为问题是它在发送后挂起,现在正在等待响应,我想我可能没有以正确的方式接收字符串。
一个问题是您 {packet, line}
并且消息不包含新行,因此回显服务器在将消息发送到处理程序之前一直等待消息完成。
此外,您应该小心使用 active
选项,因为在 controlling_process/2
调用期间收到的任何数据都将保留在前一个处理程序中。您应该使用 {active, false}
启动接受的套接字,然后在处理程序管理套接字时将其设置为 true | pos_integer()
。