2012-11-28 8 views
3

안녕하세요 저는 Erlang에서 새로운 꿀벌이지만 수동 모드에서 클라이언트를 받아들이고 메시지를 표시하는 간단한 TCP 서버를 만들 수있었습니다. 새 클라이언트가 서버에 연결할 때마다 새 프로세스가 생성됩니다. 클라이언트가 연결될 때 생성되는 프로세스를 사용하여 클라이언트에 메시지를 보낼 수있는 방법이 있습니까?Erlang : Tcp Server

다음은 코드입니다.

-module(test). 

-export([startserver/0]). 

startserver()-> 
{ok, ListenSocket}=gen_tcp:listen(1235,[binary,{active, false}]), 
connect(ListenSocket). 

connect(ListenSocket)-> 
{ok, UserSocket}=gen_tcp:accept(ListenSocket), 
Pid=spawn(? MODULE, user,[UserSocket]), 
gen_tcp:controlling_process(UserSocket, Pid), 
connect(ListenSocket). 

user(UserSocket)-> 
case gen_tcp:recv(UserSocket, 0) of. 
{ok, Binary}->% Send basic message. 

{error, closed}->% operation on close. 
end. 

내가 할 수있는 것처럼 느껴지나요?

Pid!{"Some Message"}. http://learnyousomeerlang.com/buckets-of-sockets#sockserv-revisited

당신이 당신의 연결 루프 대신 gen_server를 사용하는 경우 : 그리고 메시지가

답변

5

당신은 OTP 원칙을 사용하여 TCP 서버를 작성하기위한 튜토리얼을 시도 할 수, 비 차단 IO와 프로세스와 연관된 소켓에 보낼 수있다 상태에 Pids를 저장할 수 있습니다. 그런 다음 gen_server : cast/2를 사용하여 Pids 중 하나에 메시지를 보낼 수 있습니다.

제어 프로세스에서 클라이언트에게 메시지를 보내려는 기능은 gen_tcp : send (Socket, Message)입니다. 예를 들어 연결시 메시지를 보내려면 다음을 수행하십시오.

user(UserSocket)-> 
gen_tcp:send(UserSocket, "hello"), 
case gen_tcp:recv(UserSocket, 0) of 
    {ok, Binary}->% Send basic message. 
     gen_tcp:send(UserSocket, "basic message"), 
    {error, closed}->% operation on close. 
     gen_tcp:send(UserSocket, "this socket is closing now"), 
end. 
+0

답장을 보내 주셔서 감사합니다. gen_server() 사용 방법에 대한 참고 자료를 제공해 주시겠습니까? – Rs9766

+0

@ Rs9766 읽기 http://www.erlang.org/doc/man/gen_server.html 및 http://www.erlang.org/doc/design_principles/gen_server_concepts.html – rvirding

+0

감사합니다. 서버 개념을 설명하는 책을 가져 왔습니다. 문서는 자명하다. – Rs9766