如何通过 TCP 连接到套接字

How to connect to socket by TCP

我在 Erlang 的 OpenShift 上有一个简单的服务器,它创建套接字并等待新连接。服务器的本地 ip 是 127.10.206.129,服务器侦听 16000 端口。 我的服务器代码:

-module(chat).
-export ([start/0, wait_connect/2, handle/2]).

start() ->
{ok, ListenSocket} = gen_tcp:listen(16000, [binary, {ip,{127,10,206,129}}]),
wait_connect(ListenSocket, 0).

wait_connect(ListenSocket, Count) ->
io:format("~s~n", ["Wait..."]),
gen_tcp:accept(ListenSocket),
receive
    {tcp, _Socket, Packet} ->
        handle(Packet, Count),
        spawn(?MODULE, wait_connect, [ListenSocket, Count+1]);
    {tcp_error, _Socket, Reason} ->
        {error, Reason}
end.

我的客户代码:

-module(client).
-export ([client/2]).

client(Host, Data) ->
{ok, Socket} = gen_tcp:connect(Host, 16000, [binary]),
send(Socket, Data),
ok = gen_tcp:close(Socket).

send(Socket, <<Data/binary>>) ->
gen_tcp:send(Socket, Data).

服务器启动没有问题。我尝试在我的本地主机上运行客户端并出现错误(它尝试连接的时间比超时时间长:

 2> client:client("chat-bild.rhcloud.com", <<"Hello world!">>).
 ** exception error: no match of right hand side value {error,etimedout}
 in function  client:client/2 (client.erl, line 4)

我尝试了这个愚蠢的方法(虽然 127.10.206.129 是一个错误的 ip,因为它是服务器本地 ip):

 3> client:client({127,10,206,129}, <<"Hello world!">>).
 ** exception error: no match of right hand side value {error,econnrefused}
 in function  client:client/2 (client.erl, line 16)

如何使用 url gen_tcp:connect?

您的 listen 调用将监听接口限制为 127.10.206.129,但从第二个客户端示例来看,您的客户端无法连接到该地址。尝试从 listen 调用中删除 {ip,{127,10,206,129}} 选项,以便您的服务器侦听所有可用接口,或者找出服务器名称 "chat-bild.rhcloud.com" 对应的接口并仅在该接口上侦听。

openshift只对外开放了80、443、8000、8443端口。您无法从本地工作站连接到 OpenShift 上的其他端口,除非您使用 rhc port-forward 命令,并且该命令仅适用于卡式盒使用的已发布端口。